diff options
Diffstat (limited to 'src/eval.c')
| -rw-r--r-- | src/eval.c | 9 |
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)); |