commit 677014ec4c6f86d6a2d8502c4e8bd972919ce0ec
parent a1ec56af45b62704436f4f95ebc443cdf22383be
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Fri,  4 Sep 2015 19:17:25 +0200
Add error recovery in arguments()
Diffstat:
| M | cc1/expr.c |  |  | 37 | +++++++++++++++++++++---------------- | 
1 file changed, 21 insertions(+), 16 deletions(-)
diff --git a/cc1/expr.c b/cc1/expr.c
@@ -540,7 +540,7 @@ static Node *assign(void);
 static Node *
 arguments(Node *np)
 {
-	int n;
+	int n, toomany;;
 	Node *par = NULL, *arg;
 	Type **targs, *tp = np->type;
 
@@ -554,27 +554,32 @@ arguments(Node *np)
 
 	expect('(');
 
-	if ((n = tp->n.elem) > 0) {
-		do {
-			if ((arg = eval(assign())) == NULL)
-				unexpected();
-			if ((arg = convert(arg, *targs++, 0)) == NULL)
-				goto bad_type;
+	n = tp->n.elem;
+	if (yytoken == ')')
+		goto no_pars;
+	toomany = 0;
+
+	do {
+		arg = eval(assign());
+		if (--n < 0 && !toomany) {
+			errorp("too many arguments in function call");
+			toomany = 1;
+			continue;
+		}
+		if ((arg = convert(arg, *targs, 0)) != NULL) {
 			par = node(OPAR, arg->type, par, arg);
-		} while (--n && accept(','));
-	}
+			continue;
+		}
+		errorp("incompatible type for argument %d in function call",
+		      tp->n.elem - n + 1);
+	} while (accept(','));
 
+no_pars:
 	if (n > 0)
-		error("too few arguments in function call");
-	if (yytoken == ',')
-		error("too many arguments in function call");
+		errorp("too few arguments in function call");
 
 	expect(')');
 	return node(OCALL, np->type->type, np, par);
-
-bad_type:
-	error("incompatible type for argument %d in function call",
-	      tp->n.elem - n + 1);
 }
 
 static Node *