shithub: mc

Download patch

ref: 9dd33d5098c2784d246ce385e6acb7d1aea58df1
parent: b3f5bb4aa2b111fa1e2f1e813a7cb9975edc3b10
author: Ori Bernstein <[email protected]>
date: Tue Aug 7 21:54:31 EDT 2012

Actually fix empty vararg lists.

--- a/parse/infer.c
+++ b/parse/infer.c
@@ -411,6 +411,7 @@
     return r;
 }
 
+
 static void unifycall(Inferstate *st, Node *n)
 {
     size_t i;
@@ -426,16 +427,15 @@
         if (i == ft->nsub)
             fatal(n->line, "%s arity mismatch (expected %zd args, got %zd)",
                   ctxstr(st, n->expr.args[0]), ft->nsub - 1, n->expr.nargs - 1);
+
+        if (ft->sub[i]->type == Tyvalist)
+            break;
         inferexpr(st, n->expr.args[i], NULL, NULL);
         unify(st, n->expr.args[0], ft->sub[i], type(st, n->expr.args[i]));
-        if (i + 1 < n->expr.nargs && ft->sub[i + 1]->type == Tyvalist) {
-            i += 2; /* to prevent triggering the arity mismatch on exit */
-            break;
-        }
     }
-    if (i < ft->nsub)
+    if (i < ft->nsub && ft->sub[i]->type != Tyvalist)
         fatal(n->line, "%s arity mismatch (expected %zd args, got %zd)",
-              ctxstr(st, n->expr.args[0]), ft->nsub - 1, n->expr.nargs - 1);
+              ctxstr(st, n->expr.args[0]), ft->nsub - 1, i - 1);
     settype(st, n, ft->sub[0]);
 }