mirror of
https://github.com/cc65/cc65.git
synced 2024-11-19 06:31:31 +00:00
Error message for negative array sizes.
Restrucured struct decl parsing code. git-svn-id: svn://svn.cc65.org/cc65/trunk@1914 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
7a1a7745eb
commit
88cb1a9fd8
@ -6,9 +6,9 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998-2002 Ullrich von Bassewitz */
|
/* (C) 1998-2003 Ullrich von Bassewitz */
|
||||||
/* Wacholderweg 14 */
|
/* Römerstrasse 52 */
|
||||||
/* D-70597 Stuttgart */
|
/* D-70794 Filderstadt */
|
||||||
/* EMail: uz@musoftware.de */
|
/* EMail: uz@musoftware.de */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
@ -251,7 +251,8 @@ static SymEntry* ParseStructDecl (const char* Name, type StructType)
|
|||||||
/* Parse a struct/union declaration. */
|
/* Parse a struct/union declaration. */
|
||||||
{
|
{
|
||||||
|
|
||||||
unsigned Size;
|
unsigned StructSize;
|
||||||
|
unsigned FieldSize;
|
||||||
unsigned Offs;
|
unsigned Offs;
|
||||||
SymTable* FieldTab;
|
SymTable* FieldTab;
|
||||||
SymEntry* Entry;
|
SymEntry* Entry;
|
||||||
@ -282,7 +283,7 @@ static SymEntry* ParseStructDecl (const char* Name, type StructType)
|
|||||||
EnterStructLevel ();
|
EnterStructLevel ();
|
||||||
|
|
||||||
/* Parse struct fields */
|
/* Parse struct fields */
|
||||||
Size = 0;
|
StructSize = 0;
|
||||||
while (CurTok.Tok != TOK_RCURLY) {
|
while (CurTok.Tok != TOK_RCURLY) {
|
||||||
|
|
||||||
/* Get the type of the entry */
|
/* Get the type of the entry */
|
||||||
@ -298,18 +299,20 @@ static SymEntry* ParseStructDecl (const char* Name, type StructType)
|
|||||||
ParseDecl (&Spec, &Decl, 0);
|
ParseDecl (&Spec, &Decl, 0);
|
||||||
|
|
||||||
/* Get the offset of this field */
|
/* Get the offset of this field */
|
||||||
Offs = (StructType == T_STRUCT)? Size : 0;
|
Offs = (StructType == T_STRUCT)? StructSize : 0;
|
||||||
|
|
||||||
/* Add a field entry to the table */
|
/* Add a field entry to the table */
|
||||||
AddLocalSym (Decl.Ident, Decl.Type, SC_STRUCTFIELD, Offs);
|
AddLocalSym (Decl.Ident, Decl.Type, SC_STRUCTFIELD, Offs);
|
||||||
|
|
||||||
/* Calculate offset of next field/size of the union */
|
/* Calculate offset of next field/size of the union */
|
||||||
Offs = CheckedSizeOf (Decl.Type);
|
FieldSize = CheckedSizeOf (Decl.Type);
|
||||||
if (StructType == T_STRUCT) {
|
if (StructType == T_STRUCT) {
|
||||||
Size += Offs;
|
/* It's a struct */
|
||||||
|
StructSize += FieldSize;
|
||||||
} else {
|
} else {
|
||||||
if (Offs > Size) {
|
/* It's a union */
|
||||||
Size = Offs;
|
if (FieldSize > StructSize) {
|
||||||
|
StructSize = FieldSize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -328,7 +331,7 @@ static SymEntry* ParseStructDecl (const char* Name, type StructType)
|
|||||||
LeaveStructLevel ();
|
LeaveStructLevel ();
|
||||||
|
|
||||||
/* Make a real entry from the forward decl and return it */
|
/* Make a real entry from the forward decl and return it */
|
||||||
return AddStructSym (Name, Size, FieldTab);
|
return AddStructSym (Name, StructSize, FieldTab);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -874,6 +877,14 @@ static void Decl (const DeclSpec* Spec, Declaration* D, unsigned Mode)
|
|||||||
if (CurTok.Tok != TOK_RBRACK) {
|
if (CurTok.Tok != TOK_RBRACK) {
|
||||||
ExprDesc lval;
|
ExprDesc lval;
|
||||||
ConstExpr (&lval);
|
ConstExpr (&lval);
|
||||||
|
if (lval.ConstVal < 0) {
|
||||||
|
if (D->Ident[0] != '\0') {
|
||||||
|
Error ("Size of array `%s' is negative", D->Ident);
|
||||||
|
} else {
|
||||||
|
Error ("Size of array is negative");
|
||||||
|
}
|
||||||
|
lval.ConstVal = 1;
|
||||||
|
}
|
||||||
Size = lval.ConstVal;
|
Size = lval.ConstVal;
|
||||||
}
|
}
|
||||||
ConsumeRBrack ();
|
ConsumeRBrack ();
|
||||||
|
Loading…
Reference in New Issue
Block a user