Fix tests.
This commit is contained in:
parent
0e4b913312
commit
680a8e0283
@ -264,6 +264,7 @@ typedef struct svalue_s {
|
|||||||
#define DECLFLAG_ENUMROOT 0x08 // Multi-dimensional arrays should have an enumroot.
|
#define DECLFLAG_ENUMROOT 0x08 // Multi-dimensional arrays should have an enumroot.
|
||||||
#define DECLFLAG_MAYBE_FUNCTION 0x10 // Might be a named function.
|
#define DECLFLAG_MAYBE_FUNCTION 0x10 // Might be a named function.
|
||||||
#define DECLFLAG_DYNAMIC_ARRAYS 0x20 // Dynamic arrays are allowed.
|
#define DECLFLAG_DYNAMIC_ARRAYS 0x20 // Dynamic arrays are allowed.
|
||||||
|
#define DECLFLAG_OLD 0x40 // Known old-style declaration.
|
||||||
#define DECLMASK_NAMED_DECL (DECLFLAG_ARGUMENT | DECLFLAG_VARIABLE | DECLFLAG_MAYBE_FUNCTION)
|
#define DECLMASK_NAMED_DECL (DECLFLAG_ARGUMENT | DECLFLAG_VARIABLE | DECLFLAG_MAYBE_FUNCTION)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -1478,8 +1478,12 @@ static void dodecl(const token_t *tok)
|
|||||||
int fpublic = (tok->id == tPUBLIC);
|
int fpublic = (tok->id == tPUBLIC);
|
||||||
int fstock = (tok->id == tSTOCK);
|
int fstock = (tok->id == tSTOCK);
|
||||||
int fstatic = (tok->id == tSTATIC);
|
int fstatic = (tok->id == tSTATIC);
|
||||||
|
|
||||||
|
int flags = DECLFLAG_MAYBE_FUNCTION | DECLFLAG_VARIABLE | DECLFLAG_ENUMROOT;
|
||||||
|
if (tok->id == tNEW)
|
||||||
|
flags |= DECLFLAG_OLD;
|
||||||
|
|
||||||
parse_decl(&decl, DECLFLAG_MAYBE_FUNCTION|DECLFLAG_VARIABLE|DECLFLAG_ENUMROOT);
|
parse_decl(&decl, flags);
|
||||||
|
|
||||||
if (!decl.opertok && (tok->id == tNEW || decl.has_postdims || !lexpeek('('))) {
|
if (!decl.opertok && (tok->id == tNEW || decl.has_postdims || !lexpeek('('))) {
|
||||||
if (tok->id == tNEW && decl.is_new)
|
if (tok->id == tNEW && decl.is_new)
|
||||||
@ -2119,7 +2123,9 @@ static void declloc(int tokid)
|
|||||||
int fstatic = (tokid == tSTATIC);
|
int fstatic = (tokid == tSTATIC);
|
||||||
declinfo_t decl;
|
declinfo_t decl;
|
||||||
|
|
||||||
const int declflags = DECLFLAG_VARIABLE | DECLFLAG_ENUMROOT | DECLFLAG_DYNAMIC_ARRAYS;
|
int declflags = DECLFLAG_VARIABLE | DECLFLAG_ENUMROOT | DECLFLAG_DYNAMIC_ARRAYS;
|
||||||
|
if (tokid == tNEW || tokid == tDECL)
|
||||||
|
declflags |= DECLFLAG_OLD;
|
||||||
|
|
||||||
parse_decl(&decl, declflags);
|
parse_decl(&decl, declflags);
|
||||||
|
|
||||||
@ -3286,6 +3292,19 @@ static int parse_old_decl(declinfo_t *decl, int flags)
|
|||||||
if (decl->opertok == 0)
|
if (decl->opertok == 0)
|
||||||
strcpy(decl->name, "<unknown>");
|
strcpy(decl->name, "<unknown>");
|
||||||
} else {
|
} else {
|
||||||
|
if (!lexpeek(tSYMBOL)) {
|
||||||
|
switch (lextok(&tok)) {
|
||||||
|
case tOBJECT:
|
||||||
|
case tCHAR:
|
||||||
|
case tVOID:
|
||||||
|
case tINT:
|
||||||
|
error(143);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
lexpush();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (expecttoken(tSYMBOL, &tok))
|
if (expecttoken(tSYMBOL, &tok))
|
||||||
strcpy(decl->name, tok.str);
|
strcpy(decl->name, tok.str);
|
||||||
else
|
else
|
||||||
@ -3400,6 +3419,11 @@ int parse_decl(declinfo_t *decl, int flags)
|
|||||||
if (matchtoken(tCONST))
|
if (matchtoken(tCONST))
|
||||||
decl->type.usage |= uCONST;
|
decl->type.usage |= uCONST;
|
||||||
|
|
||||||
|
// Sometimes we know ahead of time whether the declaration will be old, for
|
||||||
|
// example, if preceded by tNEW or tDECL.
|
||||||
|
if (flags & DECLFLAG_OLD)
|
||||||
|
return parse_old_decl(decl, flags);
|
||||||
|
|
||||||
// If parsing an argument, there are two simple checks for whether this is a
|
// If parsing an argument, there are two simple checks for whether this is a
|
||||||
// new or old-style declaration.
|
// new or old-style declaration.
|
||||||
if ((flags & DECLFLAG_ARGUMENT) && (lexpeek('&') || lexpeek('{')))
|
if ((flags & DECLFLAG_ARGUMENT) && (lexpeek('&') || lexpeek('{')))
|
||||||
@ -6480,7 +6504,7 @@ static void statement(int *lastindent,int allow_decl)
|
|||||||
lexpush();
|
lexpush();
|
||||||
autozero = TRUE;
|
autozero = TRUE;
|
||||||
lastst = tNEW;
|
lastst = tNEW;
|
||||||
declloc(tNEW);
|
declloc(tok);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -6939,7 +6963,7 @@ static int dofor(void)
|
|||||||
*/
|
*/
|
||||||
nestlevel++;
|
nestlevel++;
|
||||||
autozero=1;
|
autozero=1;
|
||||||
declloc(tFOR); /* declare local variable */
|
declloc(tok.id); /* declare local variable */
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
lexpush();
|
lexpush();
|
||||||
|
Loading…
Reference in New Issue
Block a user