From ac428f89fa09a8325041589a251323fb9ed42d16 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 1 Aug 2014 10:52:27 +0100 Subject: [PATCH] use-before-definition analysis: fix checking of `with-cont-mark` form Similar to the `set!` problem. --- .../racket-test/tests/racket/letrec.rktl | 22 +++++++++++++++++++ racket/src/racket/src/letrec_check.c | 10 +++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/letrec.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/letrec.rktl index b33f0cf248..b11023c051 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/letrec.rktl +++ b/pkgs/racket-pkgs/racket-test/tests/racket/letrec.rktl @@ -127,5 +127,27 @@ b) letrec-exn?) +(err/rt-test + (letrec ([b (with-continuation-mark + 'x + (lambda () c) + ((continuation-mark-set-first + (current-continuation-marks) + 'x)))] + [c 1]) + c) + letrec-exn?) + +(err/rt-test + (letrec ([b (with-continuation-mark + 'x + (lambda () c) + (+ (random) + ((continuation-mark-set-first + (current-continuation-marks) + 'x))))] + [c 1]) + c) + letrec-exn?) (report-errs) diff --git a/racket/src/racket/src/letrec_check.c b/racket/src/racket/src/letrec_check.c index b9b5433f7d..cd08651983 100644 --- a/racket/src/racket/src/letrec_check.c +++ b/racket/src/racket/src/letrec_check.c @@ -738,14 +738,20 @@ static Scheme_Object *letrec_check_wcm(Scheme_Object *o, Letrec_Check_Frame *fra Scheme_Object *uvars, Scheme_Object *pvars, Scheme_Object *pos) { Scheme_With_Continuation_Mark *wcm; - Scheme_Object *val; + Scheme_Object *val, *val_uvars, *val_pvars, *val_pos; wcm = (Scheme_With_Continuation_Mark *)o; val = letrec_check_expr(wcm->key, frame, uvars, pvars, pos); wcm->key = val; - val = letrec_check_expr(wcm->val, frame, uvars, pvars, pos); + + /* Since a value can be accessed through `current-continuaton-marks`... */ + val_uvars = merge_vars(uvars, pvars); + val_pvars = rem_vars(pvars); + val_pos = scheme_false; + val = letrec_check_expr(wcm->val, frame, val_uvars, val_pvars, val_pos); wcm->val = val; + val = letrec_check_expr(wcm->body, frame, uvars, pvars, pos); wcm->body = val;