mbarker@bbnz.ARPA (Michael Barker) (11/11/85)
(with apologies for the length)
Some time ago, I sent a short test program out on the net for fun - I've
included it again at the end for those of you who missed it the first
time around...
and, here's what you've been waiting for :-)
summary of responses as of 11 Nov 1985
compiles and works
CPZ-48000 (z-80 cpm 2.2) Manx C
Zenith Z-120 MS-DOS 2.11 Lattice C 2.14
Perkin-Elmer 3220 running v7
TOPS-20 (DEC-20) v7 compiler from New Mexico Tech
BBN C-70 v7 compiler
Fails to compile (error type, then the list)
"ips.c", line 23: compiler error: compiler takes alignment of function
VAX ULTRIX
VAX VMS 3.7 ??? C
AT&T 370 C compiler running on CMS
Sun workstations with Sun OS 2.0 (a modified 4.2BSD)
Masscomp
Line 10: ; expected (points to first character of fist in the ford fist
declaration) Numous other error messages, including declaration mismatch
at line 22.
Microware os9/6809 cc1:
line 24: ; where other token expected (; at end of printf!!!!)
Prime C 1.1-19.1:
thanks to:
Pawka <PAWKA at NOSC-TECR>
Bob Larson <BLARSON%ECLD@ECLA>
"Josh Knight" <JOSH%YKTVMH.BITNET@WISCVM.ARPA>
Scott J. Kamin <ihnp4!onecom!sjk%seismo.UUCP@bbnccv>
Dave Sherman <ihnp4!utzoo!lsuc!dave@Berkeley>
Terry Poot <ndm20!tp%smu.csnet@CSNET-RELAY.ARPA>
Greg Titus <GREG@pinon.tccnet>
While I'm not a compiler expert, five systems saying yes and seven
saying emphatically no seems like a problem. I think the ones saying no
may be derivatives of PCC, while the others seem more likely to have
"homebrew" compilers (no derogative intent, I assure you). Anyone
feel like raising this issue with the ANSI C folks? Incidentally, our
local compiler experts say it should be ok, while various other people
have had (of course) various opinions.
Thanks again
mike
ARPA: mbarker@bbnz.ARPA
UUCP: harvard!bbnccv!mbarker
------------(repeat of previous message, edited for brevity)-------------
two relatively simple (I hope) questions:
1. please test the following program on your compiler. Does it work?
2. should it?
this is what a run of the program gives:
before use 1
that's the rub
after use 3
this is what lint had to say
"ips.c", line 23: compiler error: compiler takes alignment of function
----------------------------cut here-------------------------------
/* test program to show quirk in typedef's
*/
#include <stdio.h>
typedef ford(); /* this is questionable statement 1 */
main()
{
ford fist; /* declare the function? question 2 */
int some; /* just filler */
some = 1;
printf("before use %x\n",some);
some = fist(); /* use it */
printf("after use %x\n",some);
}
ford fist /* see, mom, no parentheses? question 3 */
{ /* this is line 23 ??? */
printf("that's the rub\n");
return(3); /* simple, eh? */
}
-----------------------(that's all, folks)-------------------------danny@nvzg2.UUCP (Danny Zerkel) (11/13/85)
> > /* test program to show quirk in typedef's > */ > > #include <stdio.h> > > typedef ford(); /* this is questionable statement 1 */ This is fine, and legal. > > main() > { > ford fist; /* declare the function? question 2 */ This again, is fine. > int some; /* just filler */ > > some = 1; > > printf("before use %x\n",some); > > some = fist(); /* use it */ > > printf("after use %x\n",some); > } > > ford fist /* see, mom, no parentheses? question 3 */ > { /* this is line 23 ??? */ > "ips.c", line 23: compiler error: compiler takes alignment of function This is where the trouble begins, and is flagged correctly by the compiler. The effect of the typedef and it's use in this context is to tell the compiler that the initialization of function fist (which returns an int) begins here. However, initialization of functions is a special case in C. The syntax of data and function initialization (at least originally) is identical [by design, it makes C look more orthoganal than it is], the semantics are different however. > printf("that's the rub\n"); > > return(3); /* simple, eh? */ > } > In the C compilers derived from the original Unix C compiler, functions are only initialized with (). Note if you change line 22 from: ford fist to: fist() the problem goes away! If the compiler figured out that you ment to initialize a function with line 22, and switched contexts, everything would again be fine. Data initialization has been changed however, and it is not clear if a '=' would be required!! The whole problem is a grey area where data becomes action (a function) and vice versa. Realistically C has no (portable) mechanism to manipulate the contents of functions, so it's probably not necessary to cloud an already terse language with two forms of function initialization. PS The error is flagged on line 23 because that's when the compiler figured out there was something wrong. It is impossible to figure out what is going on from line 22! (And compilers, like plow-men, don't look back.) ------------------------------------------------------------------------- From: Danny J. Zerkel ("I call myself, me") somewhere called ..nvzg1!danny (which is under nvzg2, if that helps) in reality, AT&T-IS, 78Q458b 151 Wymore Rd Altamonte Springs, FL 32714 (305)869-2743 (ISCOMM 7552743) "I think all right thinking people in this country are sick and tired of being told that ordinary decent people in this country are fed up with being sick and tired!" - Monty Python The author is not known to represent or have any special interests. "He's just this guy, you know."