aboutsummaryrefslogtreecommitdiffstats
path: root/src/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/eval.c b/src/eval.c
index 2bb7cfe6002..66d34808f82 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -3245,6 +3245,7 @@ funcall_lambda (Lisp_Object fun, ptrdiff_t nargs,
3245 emacs_abort (); 3245 emacs_abort ();
3246 3246
3247 i = optional = rest = 0; 3247 i = optional = rest = 0;
3248 bool previous_rest = false;
3248 for (; CONSP (syms_left); syms_left = XCDR (syms_left)) 3249 for (; CONSP (syms_left); syms_left = XCDR (syms_left))
3249 { 3250 {
3250 maybe_quit (); 3251 maybe_quit ();
@@ -3255,13 +3256,14 @@ funcall_lambda (Lisp_Object fun, ptrdiff_t nargs,
3255 3256
3256 if (EQ (next, Qand_rest)) 3257 if (EQ (next, Qand_rest))
3257 { 3258 {
3258 if (rest) 3259 if (rest || previous_rest)
3259 xsignal1 (Qinvalid_function, fun); 3260 xsignal1 (Qinvalid_function, fun);
3260 rest = 1; 3261 rest = 1;
3262 previous_rest = true;
3261 } 3263 }
3262 else if (EQ (next, Qand_optional)) 3264 else if (EQ (next, Qand_optional))
3263 { 3265 {
3264 if (optional || rest) 3266 if (optional || rest || previous_rest)
3265 xsignal1 (Qinvalid_function, fun); 3267 xsignal1 (Qinvalid_function, fun);
3266 optional = 1; 3268 optional = 1;
3267 } 3269 }
@@ -3287,10 +3289,11 @@ funcall_lambda (Lisp_Object fun, ptrdiff_t nargs,
3287 else 3289 else
3288 /* Dynamically bind NEXT. */ 3290 /* Dynamically bind NEXT. */
3289 specbind (next, arg); 3291 specbind (next, arg);
3292 previous_rest = false;
3290 } 3293 }
3291 } 3294 }
3292 3295
3293 if (!NILP (syms_left)) 3296 if (!NILP (syms_left) || previous_rest)
3294 xsignal1 (Qinvalid_function, fun); 3297 xsignal1 (Qinvalid_function, fun);
3295 else if (i < nargs) 3298 else if (i < nargs)
3296 xsignal2 (Qwrong_number_of_arguments, fun, make_fixnum (nargs)); 3299 xsignal2 (Qwrong_number_of_arguments, fun, make_fixnum (nargs));