]> git.sur5r.net Git - cc65/blobdiff - src/cc65/datatype.c
Made C's sizeof operator work with initialized void variables.
[cc65] / src / cc65 / datatype.c
index 8d17d28510db2511b1d4240d3bdb019a442a8480..2d54316cd9cbba88b28f97773107e48c8e132cac 100644 (file)
@@ -290,18 +290,18 @@ void PrintType (FILE* F, const Type* T)
                 fprintf (F, "union %s", ((SymEntry*) T->A.P)->Name);
                 break;
             case T_TYPE_ARRAY:
+                /* Recursive call */
+                PrintType (F, T + 1);
                 if (T->A.L == UNSPECIFIED) {
-                    fprintf (F, "[] ");
+                    fprintf (F, " []");
                 } else {
-                    fprintf (F, "[%ld] ", T->A.L);
+                    fprintf (F, " [%ld]", T->A.L);
                 }
-                /* Recursive call */
-                PrintType (F, T + 1);
                 return;
             case T_TYPE_PTR:
-                fprintf (F, "* ");
                 /* Recursive call */
                 PrintType (F, T + 1);
+                fprintf (F, " *");
                 return;
             case T_TYPE_FUNC:
                 fprintf (F, "function returning ");
@@ -389,7 +389,16 @@ unsigned SizeOf (const Type* T)
     switch (UnqualifiedType (T->C)) {
 
         case T_VOID:
-            return 0;   /* Assume voids have size zero */
+            /* A void variable is a cc65 extension.
+            ** Get its size (in bytes).
+            */
+            return T->A.U;
+
+        /* Beware: There's a chance that this triggers problems in other parts
+           of the compiler. The solution is to fix the callers, because calling
+           SizeOf() with a function type as argument is bad. */
+        case T_FUNC:
+            return 0;   /* Size of function is unknown */
 
         case T_SCHAR:
         case T_UCHAR:
@@ -404,7 +413,6 @@ unsigned SizeOf (const Type* T)
             return SIZEOF_INT;
 
         case T_PTR:
-        case T_FUNC:    /* Maybe pointer to function */
             return SIZEOF_PTR;
 
         case T_LONG:
@@ -433,7 +441,7 @@ unsigned SizeOf (const Type* T)
                 /* Array with unspecified size */
                 return 0;
             } else {
-                return T->A.L * SizeOf (T + 1);
+                return T->A.U * SizeOf (T + 1);
             }
 
         default: