Commit Diff


commit - 3d1d2398a3a7e94e5a9422b48b6dd2b077d1772e
commit + 7d79f46c9aff2c04161eb13e3e0c4467795a7a03
blob - b8eae69506de058d29202e1e6b4d3cf39aae0370
blob + 8735f24bd0c12b7159d6687776b08f688c2197e7
--- np.y
+++ np.y
@@ -181,13 +181,27 @@ procname: SYMBOL {
 funcall	: procname {
 		prepare_funcall();
 	} '(' args optcomma ')' {
+		struct proc	*proc;
+		int		 argc;
+
 		$$ = op_funcall($1);
-		if ($$->v.funcall.argc != $$->v.funcall.proc->minargs) {
-			yyerror("invalid arity for `%s'",
-			    $1->name);
+		proc = $$->v.funcall.proc;
+		argc = $$->v.funcall.argc;
+
+		if (argc != proc->minargs && !proc->vararg) {
+			yyerror("invalid arity for `%s': want %d arguments "
+			    "but %d given.", $1->name, proc->minargs, argc);
 			/* TODO: recursively free $$ */
 			YYERROR;
 		}
+
+		if (argc < proc->minargs && proc->vararg) {
+			yyerror("invalid arity for `%s': want at least %d "
+			    "arguments but %d given.", $1->name, proc->minargs,
+			    argc);
+			/* TODO: recursively free $$ */
+			YYERROR;
+		}
 	}
 	;