Fix a bug where local dynamic array declarations could be mistakenly parsed as old decls (bug 6280).

This commit is contained in:
David Anderson 2014-11-09 00:15:09 -08:00
parent c228be83d6
commit 22df518ab5
3 changed files with 12 additions and 1 deletions

View File

@ -271,6 +271,7 @@ typedef struct svalue_s {
#define DECLFLAG_DYNAMIC_ARRAYS 0x20 // Dynamic arrays are allowed.
#define DECLFLAG_OLD 0x40 // Known old-style declaration.
#define DECLFLAG_FIELD 0x80 // Struct field.
#define DECLFLAG_NEW 0x100 // Known new-style declaration.
#define DECLMASK_NAMED_DECL (DECLFLAG_ARGUMENT | DECLFLAG_VARIABLE | DECLFLAG_MAYBE_FUNCTION | DECLFLAG_FIELD)
typedef struct {
@ -469,6 +470,7 @@ enum TokenKind {
tENDLESS, /* endless loop, for assigment to "lastst" only */
tEMPTYBLOCK, /* empty blocks for AM bug 4825 */
tEOL, /* newline, only returned by peek_new_line() */
tNEWDECL, /* for declloc() */
tLAST_TOKEN_ID
};

View File

@ -2096,6 +2096,8 @@ static void declloc(int tokid)
int declflags = DECLFLAG_VARIABLE | DECLFLAG_ENUMROOT | DECLFLAG_DYNAMIC_ARRAYS;
if (tokid == tNEW || tokid == tDECL)
declflags |= DECLFLAG_OLD;
else if (tokid == tNEWDECL)
declflags |= DECLFLAG_NEW;
parse_decl(&decl, declflags);
@ -3499,6 +3501,8 @@ int parse_decl(declinfo_t *decl, int flags)
// example, if preceded by tNEW or tDECL.
if (flags & DECLFLAG_OLD)
return parse_old_decl(decl, flags);
if (flags & DECLFLAG_NEW)
return parse_new_decl(decl, NULL, flags);
// If parsing an argument, there are two simple checks for whether this is a
// new or old-style declaration.
@ -6791,7 +6795,7 @@ static void statement(int *lastindent,int allow_decl)
lexpush();
autozero = TRUE;
lastst = tNEW;
declloc(tok);
declloc(tNEWDECL);
return;
}
}

View File

@ -0,0 +1,5 @@
public int main()
{
bool[] egg = new bool[10];
}