mirror of
https://github.com/cc65/cc65.git
synced 2024-09-21 10:37:28 +00:00
The type category in a function definition cannot be inherited from a typedef.
This commit is contained in:
parent
12193790e5
commit
0028b14071
@ -65,6 +65,7 @@
|
|||||||
#include "preproc.h"
|
#include "preproc.h"
|
||||||
#include "standard.h"
|
#include "standard.h"
|
||||||
#include "staticassert.h"
|
#include "staticassert.h"
|
||||||
|
#include "typecmp.h"
|
||||||
#include "symtab.h"
|
#include "symtab.h"
|
||||||
|
|
||||||
|
|
||||||
@ -325,17 +326,24 @@ static void Parse (void)
|
|||||||
if (Sym && IsTypeFunc (Sym->Type)) {
|
if (Sym && IsTypeFunc (Sym->Type)) {
|
||||||
|
|
||||||
/* Function */
|
/* Function */
|
||||||
if (!comma) {
|
if (CurTok.Tok == TOK_SEMI) {
|
||||||
if (CurTok.Tok == TOK_SEMI) {
|
/* Prototype only */
|
||||||
/* Prototype only */
|
NextToken ();
|
||||||
NextToken ();
|
} else if (CurTok.Tok == TOK_LCURLY) {
|
||||||
} else if (CurTok.Tok == TOK_LCURLY) {
|
/* ISO C: The type category in a function definition cannot be
|
||||||
/* Parse the function body */
|
** inherited from a typedef.
|
||||||
NewFunc (Sym, FuncDef);
|
*/
|
||||||
|
if (IsTypeFunc (Spec.Type) && TypeCmp (Sym->Type, Spec.Type).C >= TC_EQUAL) {
|
||||||
/* Make sure we aren't omitting any work */
|
Error ("Function cannot be defined with a typedef");
|
||||||
CheckDeferredOpAllDone ();
|
} else if (comma) {
|
||||||
|
Error ("';' expected after top level declarator");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Parse the function body anyways */
|
||||||
|
NewFunc (Sym, FuncDef);
|
||||||
|
|
||||||
|
/* Make sure we aren't omitting any work */
|
||||||
|
CheckDeferredOpAllDone ();
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
6
test/err/bug2020-definition.c
Normal file
6
test/err/bug2020-definition.c
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
/* Bug #2020 - ISO/IEC 9899:1999 (E), 6.9.1 footnote 137:
|
||||||
|
** "The intent is that the type category in a function definition cannot be inherited from a typedef"
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef void F(void);
|
||||||
|
F c { } /* Should fail */
|
16
test/val/bug2020-ok.c
Normal file
16
test/val/bug2020-ok.c
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/* Bug #2020 - Right cases */
|
||||||
|
|
||||||
|
typedef int F(void); // type F is "function with no parameters returning int"
|
||||||
|
|
||||||
|
F f, g; // f and g both have type compatible with F
|
||||||
|
int f(void) { return 0; } // RIGHT: f has type compatible with F
|
||||||
|
int g() { return 0; } // RIGHT: g has type compatible with F
|
||||||
|
F *e(void) { return 0; } // e returns a pointer to a function
|
||||||
|
F *((h))(void) { return 0; } // similar: parentheses irrelevant
|
||||||
|
int (*fp)(void); // fp points to a function that has type F
|
||||||
|
F *Fp; // Fp points to a function that has type
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user