Fix a bug where local dynamic array declarations could be mistakenly parsed as old decls (bug 6280).
This commit is contained in:
parent
c228be83d6
commit
22df518ab5
@ -271,6 +271,7 @@ typedef struct svalue_s {
|
|||||||
#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 DECLFLAG_OLD 0x40 // Known old-style declaration.
|
||||||
#define DECLFLAG_FIELD 0x80 // Struct field.
|
#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)
|
#define DECLMASK_NAMED_DECL (DECLFLAG_ARGUMENT | DECLFLAG_VARIABLE | DECLFLAG_MAYBE_FUNCTION | DECLFLAG_FIELD)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -469,6 +470,7 @@ enum TokenKind {
|
|||||||
tENDLESS, /* endless loop, for assigment to "lastst" only */
|
tENDLESS, /* endless loop, for assigment to "lastst" only */
|
||||||
tEMPTYBLOCK, /* empty blocks for AM bug 4825 */
|
tEMPTYBLOCK, /* empty blocks for AM bug 4825 */
|
||||||
tEOL, /* newline, only returned by peek_new_line() */
|
tEOL, /* newline, only returned by peek_new_line() */
|
||||||
|
tNEWDECL, /* for declloc() */
|
||||||
tLAST_TOKEN_ID
|
tLAST_TOKEN_ID
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2096,6 +2096,8 @@ static void declloc(int tokid)
|
|||||||
int declflags = DECLFLAG_VARIABLE | DECLFLAG_ENUMROOT | DECLFLAG_DYNAMIC_ARRAYS;
|
int declflags = DECLFLAG_VARIABLE | DECLFLAG_ENUMROOT | DECLFLAG_DYNAMIC_ARRAYS;
|
||||||
if (tokid == tNEW || tokid == tDECL)
|
if (tokid == tNEW || tokid == tDECL)
|
||||||
declflags |= DECLFLAG_OLD;
|
declflags |= DECLFLAG_OLD;
|
||||||
|
else if (tokid == tNEWDECL)
|
||||||
|
declflags |= DECLFLAG_NEW;
|
||||||
|
|
||||||
parse_decl(&decl, declflags);
|
parse_decl(&decl, declflags);
|
||||||
|
|
||||||
@ -3499,6 +3501,8 @@ int parse_decl(declinfo_t *decl, int flags)
|
|||||||
// example, if preceded by tNEW or tDECL.
|
// example, if preceded by tNEW or tDECL.
|
||||||
if (flags & DECLFLAG_OLD)
|
if (flags & DECLFLAG_OLD)
|
||||||
return parse_old_decl(decl, flags);
|
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
|
// If parsing an argument, there are two simple checks for whether this is a
|
||||||
// new or old-style declaration.
|
// new or old-style declaration.
|
||||||
@ -6791,7 +6795,7 @@ static void statement(int *lastindent,int allow_decl)
|
|||||||
lexpush();
|
lexpush();
|
||||||
autozero = TRUE;
|
autozero = TRUE;
|
||||||
lastst = tNEW;
|
lastst = tNEW;
|
||||||
declloc(tok);
|
declloc(tNEWDECL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
5
sourcepawn/compiler/tests/ok-local-dynamic-bool.sp
Normal file
5
sourcepawn/compiler/tests/ok-local-dynamic-bool.sp
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
public int main()
|
||||||
|
{
|
||||||
|
bool[] egg = new bool[10];
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user