From ca002494e3125595741bbc08cc74ceffadabb52b Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 10 Oct 2013 17:32:44 -0600 Subject: [PATCH] =?UTF-8?q?fix=20an=20inconsistency=20in=20`free-identifie?= =?UTF-8?q?r=3D=3F`?= Closes PR 13982 --- .../racket-test/tests/racket/macro.rktl | 27 +++++++++++++++++++ racket/src/racket/src/syntax.c | 17 ++++++++++-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/macro.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/macro.rktl index 640b0723ff..8bb6146c6a 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/macro.rktl +++ b/pkgs/racket-pkgs/racket-test/tests/racket/macro.rktl @@ -970,6 +970,33 @@ (lam x x))) +;; ---------------------------------------- +;; Check consistency of `free-identifier=?' and binding + +(module consistency-free-id-A racket + (provide g (rename-out [*a a])) + (define *a 10) + (define a 10) + (define-syntax g #'a)) + +(module consistency-free-id-B racket + (require 'consistency-free-id-A) + (provide consistency-free-id) + (define-syntax (n stx) + (syntax-case stx () + [(_ ref) + (with-syntax ([in (syntax-local-introduce + (syntax-local-value #'g))]) + #'(let ([in 10]) ; BINDING + (list (free-identifier=? #'in #'ref) + in + ref)))])) ; REFERENCE + (define (consistency-free-id) (n a))) + +(require 'consistency-free-id-B) + +(test (list #t 10 10) consistency-free-id) + ;; ---------------------------------------- (report-errs) diff --git a/racket/src/racket/src/syntax.c b/racket/src/racket/src/syntax.c index 581538e076..6643dd37de 100644 --- a/racket/src/racket/src/syntax.c +++ b/racket/src/racket/src/syntax.c @@ -4707,6 +4707,7 @@ int scheme_stx_module_eq3(Scheme_Object *a, Scheme_Object *b, { Scheme_Object *bsym; Scheme_Hash_Table *free_id_recur; + int must_be_lex; if (!a || !b) return (a == b); @@ -4730,9 +4731,18 @@ int scheme_stx_module_eq3(Scheme_Object *a, Scheme_Object *b, asym = a; } + must_be_lex = 0; + /* Same name? */ - if (!SAME_OBJ(asym, bsym)) - return 0; + if (!SAME_OBJ(asym, bsym)) { + /* It's ok to have different names if they have + the same symbolic name and the same lexical binding, + so double-check that our shortcut worked... */ + if (SAME_OBJ(SCHEME_STX_VAL(a), SCHEME_STX_VAL(b))) + must_be_lex = 1; + else + return 0; + } if ((a == asym) || (b == bsym)) return 1; @@ -4741,6 +4751,9 @@ int scheme_stx_module_eq3(Scheme_Object *a, Scheme_Object *b, a = resolve_env(a, a_phase, 1, NULL, NULL, NULL, NULL, 0, free_id_recur); release_recur_table(free_id_recur); + if (must_be_lex && !SCHEME_SYMBOLP(a)) + return 0; + free_id_recur = make_recur_table(); b = resolve_env(b, b_phase, 1, NULL, NULL, NULL, NULL, 0, free_id_recur); release_recur_table(free_id_recur);