From d3677524b8f7429f9ef6a5145dbc245ea37b99ab Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 19 Jul 2012 20:42:19 -0500 Subject: [PATCH] macro expander fix Relevant to PR 12863 Merge to v5.3 --- collects/tests/racket/macro.rktl | 27 +++++++++++++++++++++++++++ src/racket/src/compenv.c | 2 +- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/collects/tests/racket/macro.rktl b/collects/tests/racket/macro.rktl index 44d070bcd9..fdc31c388b 100644 --- a/collects/tests/racket/macro.rktl +++ b/collects/tests/racket/macro.rktl @@ -638,6 +638,33 @@ #'#f) (two)) +;; ---------------------------------------- +;; Related: check that matching no marks is considered less +;; of a match than matching with marks: + +(module another-test-empty-marks-with-context racket/base + (require (for-syntax racket/base)) + + (define-for-syntax count 0) + (define-for-syntax (inc-count!) (set! count (add1 count))) + + (define-syntax (foo stx) + (syntax-case stx () + [(_ x e) + (let ([cid-marker (make-syntax-introducer)]) + (with-syntax ([y (cid-marker #'x)]) + #'(begin + (define y e) + (+ y 1) + (define-syntax x + (lambda (stx) + (inc-count!) + (when (= count 5) (error "stop")) + #'y)))))])) + + (module* test #f + (foo eX 3))) + ;; ---------------------------------------- ;; Check `free-identifier=?' propagation, ;; definition contexts, and `syntax-local-bind-syntaxes' diff --git a/src/racket/src/compenv.c b/src/racket/src/compenv.c index 08d1596998..d0585ee63d 100644 --- a/src/racket/src/compenv.c +++ b/src/racket/src/compenv.c @@ -1112,7 +1112,7 @@ Scheme_Object *scheme_tl_id_sym(Scheme_Env *env, Scheme_Object *id, Scheme_Objec if (SCHEME_NULLP(amarks)) { /* can always match empty marks */ best_match = SCHEME_CDR(a); - best_match_skipped = 0; + best_match_skipped = scheme_proper_list_length(marks); } else if (!SCHEME_PAIRP(marks)) { /* To be better than nothing, could only match exactly: */ if (scheme_equal(amarks, marks)) {