mirror of
https://github.com/cc65/cc65.git
synced 2025-08-09 13:25:06 +00:00
Fixed handling multiple storage specifiers in one declaration.
This commit is contained in:
@@ -410,6 +410,48 @@ static void FixQualifiers (Type* DataType)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static unsigned ParseOneStorageClass (void)
|
||||||
|
/* Parse and return a storage class */
|
||||||
|
{
|
||||||
|
unsigned StorageClass = 0;
|
||||||
|
|
||||||
|
/* Check the storage class given */
|
||||||
|
switch (CurTok.Tok) {
|
||||||
|
|
||||||
|
case TOK_EXTERN:
|
||||||
|
StorageClass = SC_EXTERN | SC_STATIC;
|
||||||
|
NextToken ();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TOK_STATIC:
|
||||||
|
StorageClass = SC_STATIC;
|
||||||
|
NextToken ();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TOK_REGISTER:
|
||||||
|
StorageClass = SC_REGISTER | SC_STATIC;
|
||||||
|
NextToken ();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TOK_AUTO:
|
||||||
|
StorageClass = SC_AUTO;
|
||||||
|
NextToken ();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TOK_TYPEDEF:
|
||||||
|
StorageClass = SC_TYPEDEF;
|
||||||
|
NextToken ();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return StorageClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void ParseStorageClass (DeclSpec* D, unsigned DefStorage)
|
static void ParseStorageClass (DeclSpec* D, unsigned DefStorage)
|
||||||
/* Parse a storage class */
|
/* Parse a storage class */
|
||||||
{
|
{
|
||||||
@@ -417,38 +459,21 @@ static void ParseStorageClass (DeclSpec* D, unsigned DefStorage)
|
|||||||
D->Flags &= ~DS_DEF_STORAGE;
|
D->Flags &= ~DS_DEF_STORAGE;
|
||||||
|
|
||||||
/* Check the storage class given */
|
/* Check the storage class given */
|
||||||
switch (CurTok.Tok) {
|
D->StorageClass = ParseOneStorageClass ();
|
||||||
|
if (D->StorageClass == 0) {
|
||||||
case TOK_EXTERN:
|
/* No storage class given, use default */
|
||||||
D->StorageClass = SC_EXTERN | SC_STATIC;
|
D->Flags |= DS_DEF_STORAGE;
|
||||||
NextToken ();
|
D->StorageClass = DefStorage;
|
||||||
break;
|
} else {
|
||||||
|
unsigned StorageClass = ParseOneStorageClass ();
|
||||||
case TOK_STATIC:
|
while (StorageClass != 0) {
|
||||||
D->StorageClass = SC_STATIC;
|
if (D->StorageClass == StorageClass) {
|
||||||
NextToken ();
|
Warning ("Duplicate storage class specifier");
|
||||||
break;
|
} else {
|
||||||
|
Error ("Conflicting storage class specifier");
|
||||||
case TOK_REGISTER:
|
}
|
||||||
D->StorageClass = SC_REGISTER | SC_STATIC;
|
StorageClass = ParseOneStorageClass ();
|
||||||
NextToken ();
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
case TOK_AUTO:
|
|
||||||
D->StorageClass = SC_AUTO;
|
|
||||||
NextToken ();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TOK_TYPEDEF:
|
|
||||||
D->StorageClass = SC_TYPEDEF;
|
|
||||||
NextToken ();
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
/* No storage class given, use default */
|
|
||||||
D->Flags |= DS_DEF_STORAGE;
|
|
||||||
D->StorageClass = DefStorage;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user