S170MIKO%HTIKUB5.BITNET@wiscvm.wisc.EDU (08/13/87)
Greetings all.
After installing VAX C v2.3 I added prototypes and recompiled all my
C-modules, and hit a clear bug with nested prototypes (really pointers
to functions with prototypes).
The following piece of code:
void f1(void (*p1) (void));
typedef void (*func_t) (int);
void f2(func_t p2)
{ (*p2)(5); }
makes the compiler complain:
{ (*p2)(5); }
INVCONVERT, The source or target of a conversion is noncomputational.
At line number 4 in USER01:[S170.C]BUG.C;1.
MISARGNUMBER, The number of arguments passed to the function does not
match the number declared in a previous function prototype.
At line number 4 in USER01:[S170.C]BUG.C;1.
It compiles ok if
a. lines 1 and 2 are reversed, or
b. p1 and p2 differ in result-type, or
c. the "5" in line 4 is left out, or
d. the third "void" in line 1 is left out, or
e. all three "*"s are left out (but then you can't call f2!);
but leaving out "int" in line 2 of changing it to something else makes no
difference.
After some more trying it is clear that the compiler notices only the
first prototype it sees for any type pointer_to_function_returning_foo
and ignores all others.
I hit this bug when compiling a module that contains a function like f2
above, and also #includes stdlib.h which contains the line
int atexit(void (*func) (void));
^^^^
I will of course SPR this problem, but I thought I'd let you all know
first and invite comments/flames.
My advice is not to use function prototypes with pointer_to_function
yet (and hence no nested prototypes), and to change stdlib.h (remember:
even if you don't use prototypes, you're still in trouble if you use
pointer_to_function_returning_void).
I'm posting this message to INFO-VAX and INFO-C: sorry if you see it
twice.
Michiel
----------------------------------------------------------------------
Michiel Koren EARN/Bitnet: s170miko@htikub5
Tilburg University SURFnet: kubvx1::s170miko
Netherlands PSI-mail: PSI%+204 1420061 0610::s170miko
Phone: +31 13 662559
Papernet: P.O.Box 90153
5000 LE TILBURG
----------------------------------------------------------------------