diff --git a/pkgs/racket-test-core/tests/racket/optimize.rktl b/pkgs/racket-test-core/tests/racket/optimize.rktl index 5730c39785..1da94bca11 100644 --- a/pkgs/racket-test-core/tests/racket/optimize.rktl +++ b/pkgs/racket-test-core/tests/racket/optimize.rktl @@ -1356,7 +1356,10 @@ '(lambda () (let ([y (random)]) (begin0 y (set! y 5))))) - + +(test-comp '(lambda (w) (car w) (mcar w)) + '(lambda (w) (begin (car w) (mcar w) (random)))) + ; test for unary aplications (test-comp -1 '(- 1)) diff --git a/racket/src/racket/src/optimize.c b/racket/src/racket/src/optimize.c index 41d3c683d7..212934fcd7 100644 --- a/racket/src/racket/src/optimize.c +++ b/racket/src/racket/src/optimize.c @@ -2840,7 +2840,8 @@ static void check_known2(Optimize_Info *info, Scheme_App2_Rec *app, Scheme_Object *rand, int id_offset, const char *who, Scheme_Object *expect_pred, Scheme_Object *unsafe) /* Replace the rator with an unsafe version if we know that it's ok. Alternatively, - the rator implies a check, so add type information for subsequent expressions. */ + the rator implies a check, so add type information for subsequent expressions. + If the rand has alredy a different type, mark that this will generate an error. */ { if (IS_NAMED_PRIM(app->rator, who)) { if (SAME_TYPE(SCHEME_TYPE(rand), scheme_local_type)) { @@ -2853,8 +2854,11 @@ static void check_known2(Optimize_Info *info, Scheme_App2_Rec *app, return; pred = optimize_get_predicate(pos, info); - if (pred && SAME_OBJ(pred, expect_pred)) - app->rator = unsafe; + if (pred) + if (SAME_OBJ(pred, expect_pred)) + app->rator = unsafe; + else + info->escapes = 1; else add_type(info, pos, expect_pred); }