diff --git a/collects/racket/private/class-internal.rkt b/collects/racket/private/class-internal.rkt index 882456e9b0..ccb4cc351e 100644 --- a/collects/racket/private/class-internal.rkt +++ b/collects/racket/private/class-internal.rkt @@ -2547,14 +2547,14 @@ An example (get-interface-contract-info i8 'x) - '((# i8 #f i6) (# i6 i8 i2) - (# i2 i6 i1) (# i1 i2 #f) + '((# i8 #f i8) (# i6 i8 i6) + (# i2 i6 i2) (# i1 i2 #f) - (# i7 i8 i4) (# i4 i7 i2) + (# i7 i8 i7) (# i4 i7 i4) - (# i3 i4 i1) + (# i3 i4 i3) - (# i5 i7 i3)) + (# i5 i7 i5)) |# ;; interface symbol -> (listof (list contract name (or blame #f) (or blame #f))) ;; traverse hierarchy to find ctc/blame info for a given method @@ -2579,8 +2579,8 @@ An example [(not our-ctc) dedup-infos] ;; if the parent's don't contract it, then it's just our ctc [(null? dedup-infos) (list (list our-ctc our-name #f #f))] - ;; our ctc should have a negative party of the first parent - [else (cons (list our-ctc our-name #f (cadr (car dedup-infos))) + ;; our ctc should have a negative party of ourself (for behav. subtyping) + [else (cons (list our-ctc our-name #f our-name) ;; replace occurrences of #f positive blame with this interface (map (λ (info) (if (not (caddr info)) diff --git a/collects/tests/racket/contract-test.rktl b/collects/tests/racket/contract-test.rktl index 0629c01a2d..773d820554 100644 --- a/collects/tests/racket/contract-test.rktl +++ b/collects/tests/racket/contract-test.rktl @@ -8517,7 +8517,7 @@ [i2<%> (interface (i1<%>) [m (->m integer? integer?)])] [c% (class* object% (i2<%>) (super-new) (define/public (m x) x))]) (send (new c%) m 3.14)) - "(interface i1<%>)") + "(interface i2<%>)") (test/spec-failed 'interface-higher-order-5 @@ -8526,7 +8526,38 @@ [c% (class* object% (i2<%>) (super-new) (define/public (m x) 3.14))]) (send (new c%) m 3)) "(class c%)") - + + (test/spec-failed + 'interface-higher-order-6 + '(let* ([i1<%> (interface () [m (->m integer? integer?)])] + [i2<%> (interface (i1<%>) [m (->m number? number?)])] + [c% (class* object% (i2<%>) (super-new) (define/public (m x) 3.14))]) + (send (new c%) m 3)) + "(interface i2<%>)") + + (test/spec-passed + 'interface-higher-order-7 + '(let* ([i1<%> (interface () [m (->m integer? number?)])] + [i2<%> (interface (i1<%>) [m (->m number? integer?)])] + [c% (class* object% (i2<%>) (super-new) (define/public (m x) x))]) + (send (new c%) m 3))) + + (test/spec-failed + 'interface-higher-order-7 + '(let* ([i1<%> (interface () [m (->m integer? number?)])] + [i2<%> (interface (i1<%>) [m (->m number? integer?)])] + [c% (class* object% (i2<%>) (super-new) (define/public (m x) x))]) + (send (new c%) m 3.14)) + "top-level") + + (test/spec-failed + 'interface-higher-order-7 + '(let* ([i1<%> (interface () [m (->m integer? number?)])] + [i2<%> (interface (i1<%>) [m (->m number? integer?)])] + [c% (class* object% (i2<%>) (super-new) (define/public (m x) 3.14))]) + (send (new c%) m 3)) + "(class c%)") + ; ; ;