diff --git a/typed-racket-lib/typed-racket/typecheck/toplevel-trampoline.rkt b/typed-racket-lib/typed-racket/typecheck/toplevel-trampoline.rkt index dc5164a4..8e24f887 100644 --- a/typed-racket-lib/typed-racket/typecheck/toplevel-trampoline.rkt +++ b/typed-racket-lib/typed-racket/typecheck/toplevel-trampoline.rkt @@ -66,22 +66,23 @@ (local-expand/capture* #'e 'top-level (kernel-form-identifier-list)))) (syntax-parse head-expanded #:literal-sets (kernel-literals) - [(begin (define-values (n) _) ... - (~and (~or _:ignore^ _:ignore-some^) - (~not (~or _:tr:class^ - _:tr:unit^ - _:tr:unit:invoke^ - _:tr:unit:compound^ - _:tr:unit:from-context^)))) - head-expanded] - ;; keep trampolining on begins - [(begin (define-values (n) e-rhs) ... (begin e ... e-last)) - #`(begin (tc-toplevel-trampoline orig-stx (define-values (n) e-rhs)) - ... - (tc-toplevel-trampoline orig-stx e) ... - #,(if report? - #'(tc-toplevel-trampoline/report orig-stx e-last) - #'(tc-toplevel-trampoline orig-stx e-last)))] + ;; keep trampolining on begins, transfer syntax properties so that ignore + ;; properties are retained in the begin subforms + [(begin (define-values (n) e-rhs) ... + (~and the-begin (begin e ... e-last))) + (define e*s + (for/list ([e (in-list (syntax->list #'(e ...)))]) + (syntax-track-origin e #'the-begin #'begin))) + (define e-last* + (syntax-track-origin #'e-last #'the-begin #'begin)) + (with-syntax ([(e ...) e*s] + [e-last e-last*]) + #`(begin (tc-toplevel-trampoline orig-stx (define-values (n) e-rhs)) + ... + (tc-toplevel-trampoline orig-stx e) ... + #,(if report? + #'(tc-toplevel-trampoline/report orig-stx e-last) + #'(tc-toplevel-trampoline orig-stx e-last))))] [_ (define fully-expanded ;; a non-begin form can still cause lifts, so still have to catch them diff --git a/typed-racket-test/fail/gh-issue-271.rkt b/typed-racket-test/fail/gh-issue-271.rkt new file mode 100644 index 00000000..52f45e7b --- /dev/null +++ b/typed-racket-test/fail/gh-issue-271.rkt @@ -0,0 +1,13 @@ +#; +(exn-pred #rx"could not be converted") +#lang racket/load + +;; Tests that p? cannot be generated + +(require typed/racket) + +(define-predicate p? (All (A) (Listof A))) + +(let () + (: x (U (Listof Integer) Integer)) (define x '(1 2 3)) + (if (p? x) 0 (add1 x)))