]> git.sur5r.net Git - cc65/commitdiff
Make struct work as documented
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 6 Dec 2003 13:35:05 +0000 (13:35 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 6 Dec 2003 13:35:05 +0000 (13:35 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@2716 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ca65/struct.c

index 307171d8a26d188f800af506b3fa0823b6f6ed79..583d6338971f14733257a60a704f85553be1b6ad 100644 (file)
@@ -83,6 +83,11 @@ static long Member (long AllocSize)
         AllocSize *= Multiplicator;
     }
 
+    /* Check the size for a reasonable value */
+    if (AllocSize >= 0x10000) {
+        Error ("Range error");
+    }
+
     /* Return the size */
     return AllocSize;
 }
@@ -99,13 +104,7 @@ static long DoStructInternal (long Offs, unsigned Type)
      * is started.
      */
     int Anon = (Tok != TOK_IDENT);
-    if (Anon) {
-        unsigned char T = GetCurrentSymTabType ();
-        if (T != ST_STRUCT) {
-            ErrorSkip ("Struct/union needs a name");
-            return 0;
-        }
-    } else {
+    if (!Anon) {
         /* Enter a new scope, then skip the name */
         SymEnterLevel (SVal, ST_STRUCT, ADDR_SIZE_ABS);
         NextTok ();
@@ -178,10 +177,8 @@ static long DoStructInternal (long Offs, unsigned Type)
                     Error ("Not a struct/union");
                 } else {
                     SymEntry* SizeSym = GetSizeOfScope (Struct);
-                    if (!SymIsDef (SizeSym)) {
+                    if (!SymIsDef (SizeSym) || !SymIsConst (SizeSym, &MemberSize)) {
                         Error ("Size of struct/union is unknown");
-                    } else {
-                        MemberSize = GetSymVal (SizeSym);
                     }
                 }
                 MemberSize *= Member (MemberSize);