From: Nick Bowler Date: Thu, 7 Jul 2011 02:31:48 +0000 (-0400) Subject: Validate function return types. X-Git-Tag: v1~144 X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/commitdiff_plain/941b006002df94fa41d413d01cc55f15a8ecbd31 Validate function return types. --- diff --git a/src/parse-decl.c b/src/parse-decl.c index dd4bd19..059f5f7 100644 --- a/src/parse-decl.c +++ b/src/parse-decl.c @@ -275,6 +275,10 @@ reduce_parentheses(struct cdecl_declarator **p, struct cdecl_declarator *d) return 0; } +/* + * Function parameters and return types have a few restrictions that are + * really easy to check in comparison to the above absurdity. + */ static int check_parameters(struct cdecl_declarator **p, struct cdecl_declarator *d) { @@ -307,6 +311,28 @@ check_parameters(struct cdecl_declarator **p, struct cdecl_declarator *d) return 0; } +/* + * Functions cannot return arrays or functions. Since the parse tree is + * "inside-out", we need to look for functions as the child declarator. + */ +static int +check_rettypes(struct cdecl_declarator **p, struct cdecl_declarator *d) +{ + if (!d->child || d->child->type != CDECL_DECL_FUNCTION) + return 0; + + switch (d->type) { + case CDECL_DECL_FUNCTION: + fprintf(stderr, "functions cannot return functions\n"); + return -1; + case CDECL_DECL_ARRAY: + fprintf(stderr, "functions cannot return arrays\n"); + return -1; + } + + return 0; +} + /* * Traverse the parse tree, calling a function on every declarator in a * depth-first preorder traversal. The function is given a pointer to the @@ -364,6 +390,8 @@ struct cdecl *cdecl_parse_decl(const char *declstr) goto err; if (!forall_declarators(i, check_parameters)) goto err; + if (!forall_declarators(i, check_rettypes)) + goto err; if (!valid_declspecs(i, true)) goto err;