From: Nick Bowler Date: Sat, 24 Mar 2012 16:12:22 +0000 (-0400) Subject: Add a check to reject extra specifiers on void function parameters. X-Git-Tag: v1~48 X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/commitdiff_plain/0396ca73dde69b0889fd05da778abbc6a8fe7d6d Add a check to reject extra specifiers on void function parameters. --- diff --git a/src/parse-decl.c b/src/parse-decl.c index 5c8e684..45cf67f 100644 --- a/src/parse-decl.c +++ b/src/parse-decl.c @@ -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; }