From 6dfc20d3ecb10f48bfed8317a6855add7879f463 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sat, 19 Sep 2015 19:25:34 -0600 Subject: [PATCH] fix inferred-name propagation for internal-definition contexts Set the name while checking for an immediate expansion when no other forms follow. --- pkgs/racket-test-core/tests/racket/name.rktl | 10 ++++++++++ racket/src/racket/src/compile.c | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/pkgs/racket-test-core/tests/racket/name.rktl b/pkgs/racket-test-core/tests/racket/name.rktl index 03a634be38..151460f0f6 100644 --- a/pkgs/racket-test-core/tests/racket/name.rktl +++ b/pkgs/racket-test-core/tests/racket/name.rktl @@ -134,4 +134,14 @@ 5)) #rx"^(?!.*unmentionable)") + +(test 'norm values + (let-syntax ([m (lambda (stx) + #`'#,(syntax-local-name))]) + (define norm + (let () + (define x 8) + (m))) + norm)) + (report-errs) diff --git a/racket/src/racket/src/compile.c b/racket/src/racket/src/compile.c index d214c90fef..47a046d2e6 100644 --- a/racket/src/racket/src/compile.c +++ b/racket/src/racket/src/compile.c @@ -5918,12 +5918,17 @@ compile_expand_block(Scheme_Object *forms, Scheme_Comp_Env *env, int more = 1, is_last; is_last = SCHEME_STX_NULLP(SCHEME_STX_CDR(forms)); + if (is_last) + env->value_name = orig_vname; result = forms; /* Check for macro expansion, which could mask the real define-values, define-syntax, etc.: */ first = scheme_check_immediate_macro(first, env, rec, drec, &gval, is_last); + + if (is_last) + env->value_name = NULL; if (SAME_OBJ(gval, scheme_begin_syntax)) { /* Inline content */ @@ -6141,7 +6146,11 @@ compile_expand_block(Scheme_Object *forms, Scheme_Comp_Env *env, first = scheme_datum_to_syntax(first, forms, forms, 0, 0); SCHEME_EXPAND_OBSERVE_NEXT(env->observer); is_last = SCHEME_STX_NULLP(SCHEME_STX_CDR(result)); + if (is_last) + env->value_name = orig_vname; first = scheme_check_immediate_macro(first, env, rec, drec, &gval, is_last); + if (is_last) + env->value_name = NULL; more = 1; if (NOT_SAME_OBJ(gval, scheme_define_values_syntax) && NOT_SAME_OBJ(gval, scheme_define_syntaxes_syntax)) {