]> git.draconx.ca Git - cdecl99.git/commitdiff
Add a check to reject extra specifiers on void function parameters.
authorNick Bowler <nbowler@draconx.ca>
Sat, 24 Mar 2012 16:12:22 +0000 (12:12 -0400)
committerNick Bowler <nbowler@draconx.ca>
Sat, 24 Mar 2012 16:12:22 +0000 (12:12 -0400)
src/parse-decl.c

index 5c8e6845afad1777f3f97f8e5876387fa19ae2dd..45cf67fcc5f7a8323a5624bd59a83a28d5cb94bb 100644 (file)
@@ -283,21 +283,26 @@ check_parameters(struct cdecl_declarator **p, struct cdecl_declarator *d)
                if (!valid_declspecs(param, false))
                        return -1;
 
+               /* Check for "void" function parameters as a special case. */
                for (spec = param->specifiers; spec; spec = spec->next) {
-                       if (spec->type == CDECL_TYPE_VOID
-                           && param->declarators->type == CDECL_DECL_NULL)
-                               has_void = true;
+                       if (param->declarators->type != CDECL_DECL_NULL)
+                               continue;
+                       if (spec->type != CDECL_TYPE_VOID)
+                               continue;
+
+                       if (spec != param->specifiers || spec->next != NULL) {
+                               fprintf(stderr, "void parameter must not have extra specifiers\n");
+                               return -1;
+                       } else if (d->u.function.parameters->next) {
+                               fprintf(stderr, "a void parameter must stand alone\n");
+                               return -1;
+                       } else if (d->u.function.variadic) {
+                               fprintf(stderr, "variadic functions cannot have a void parameter\n");
+                               return -1;
+                       }
                }
        }
 
-       if (has_void && d->u.function.parameters->next) {
-               fprintf(stderr, "a void parameter must stand alone\n");
-               return -1;
-       } else if (has_void && d->u.function.variadic) {
-               fprintf(stderr, "variadic functions cannot have a void parameter\n");
-               return -1;
-       }
-
        return 0;
 }