Fix a bug where local dynamic array declarations could be mistakenly parsed as old decls (bug 6279).
This commit is contained in:
		
							parent
							
								
									099f299113
								
							
						
					
					
						commit
						046f167b6e
					
				| @ -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