]> git.draconx.ca Git - cdecl99.git/commitdiff
Validate function return types.
authorNick Bowler <nbowler@draconx.ca>
Thu, 7 Jul 2011 02:31:48 +0000 (22:31 -0400)
committerNick Bowler <nbowler@draconx.ca>
Thu, 7 Jul 2011 02:31:48 +0000 (22:31 -0400)
src/parse-decl.c

index dd4bd199b52210ec0eb2e6cdef0a1e650f333eb5..059f5f770a2d6ecbb7af799a89f10363d54b93f0 100644 (file)
@@ -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;