X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/blobdiff_plain/425ed781f7a27bc415e13a1901899e2c7b11e4c8..0c61f9637a469ac7a28b5a329551b03e6ad14d62:/src/parse-decl.c diff --git a/src/parse-decl.c b/src/parse-decl.c index 4489532..2757703 100644 --- a/src/parse-decl.c +++ b/src/parse-decl.c @@ -1,31 +1,30 @@ /* - * Parse and validate C declarations. - * Copyright © 2011-2012 Nick Bowler + * Parse and validate C declarations. + * Copyright © 2011-2012, 2020-2021 Nick Bowler * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ + #include #include #include #include #include "cdecl.h" -#include "typemap.h" +#include "cdecl-internal.h" #include "parse.h" #include "scan.h" -#include "i18n.h" -#include "normalize.h" /* * Verify the declaration specifiers of a declaration. If top is true, treat @@ -116,12 +115,6 @@ static bool valid_declspecs(struct cdecl *decl, bool top) * if a declarator could be interpreted as something other than a function, * do that. * - * - The function declarator has a null child declarator. - * - The function declarator has exactly one parameter, and is not variadic. - * - The function parameter has a type specifier, and it is a typedef name. - * - The function parameter has no other declaration specifiers. - * - The function parameter does not declare an identifier. - * * Since cdecl99 supports things like [*] in any context (in C, such constructs * are only valid in function parameter lists), we don't treat them specially * here. @@ -165,6 +158,8 @@ static bool function_is_reducible(struct cdecl_declarator *d) return false; /* e.g. int (int) */ if (d->u.function.parameters->specifiers->next) return false; /* e.g. int (size_t const) */ + if (d->u.function.parameters->declarators->type == CDECL_DECL_POINTER) + return false; /* e.g. int (x *) */ return true; } @@ -450,10 +445,12 @@ struct cdecl *cdecl_parse_decl(const char *declstr) * new specifier list. */ norm_specs = cdecl__normalize_specs(decl->specifiers); - for (struct cdecl *i = decl; i; i = i->next) { i->specifiers = norm_specs; + } + /* Now perform checks and simplifications on each declarator. */ + for (struct cdecl *i = decl; i; i = i->next) { if (!forall_declarators(i, reduce_parentheses)) goto err; if (!forall_declarators(i, simplify_functions))