File tree Expand file tree Collapse file tree 2 files changed +126
-1
lines changed
compiler/src/dotty/tools/dotc/typer Expand file tree Collapse file tree 2 files changed +126
-1
lines changed Original file line number Diff line number Diff line change @@ -586,10 +586,14 @@ object ProtoTypes {
586586 else if (tp.symbol.isStatic || (tp.prefix `eq` NoPrefix )) tp
587587 else tp.derivedSelect(wildApprox(tp.prefix, theMap, seen))
588588 case tp @ AppliedType (tycon, args) =>
589+ def wildToBounds (tp : Type ) = tp match {
590+ case WildcardType (tp : TypeBounds ) => tp
591+ case tp => tp
592+ }
589593 wildApprox(tycon, theMap, seen) match {
590594 case _ : WildcardType => WildcardType // this ensures we get a * type
591595 case tycon1 => tp.derivedAppliedType(tycon1,
592- args.mapConserve(arg => wildApprox(arg, theMap, seen)))
596+ args.mapConserve(arg => wildToBounds( wildApprox(arg, theMap, seen) )))
593597 }
594598 case tp : RefinedType => // default case, inlined for speed
595599 tp.derivedRefinedType(
Original file line number Diff line number Diff line change 1+ object K1 {
2+ class Foo [T ]
3+
4+ class Bar [F [_]]
5+ object Bar {
6+ implicit def barF [F [_]](implicit fooF : Foo [Bar [F ]]): Bar [F ] = null
7+ }
8+
9+ class A [T ]
10+ object A {
11+ implicit def fooA [F [_[_]]](implicit barB : F [B ]): Foo [F [A ]] = null
12+ }
13+
14+ class B [T ]
15+ object B {
16+ implicit def fooB [F [_[_]]]: Foo [F [B ]] = null
17+ }
18+ }
19+
20+ object K1U {
21+ class Foo [T ]
22+
23+ class Bar [F [_ <: Int ]]
24+ object Bar {
25+ implicit def barF [F [_ <: Int ]](implicit fooF : Foo [Bar [F ]]): Bar [F ] = null
26+ }
27+
28+ class A [T <: Int ]
29+ object A {
30+ implicit def fooA [F [_[_ <: Int ]]](implicit barB : F [B ]): Foo [F [A ]] = null
31+ }
32+
33+ class B [T <: Int ]
34+ object B {
35+ implicit def fooB [F [_[_ <: Int ]]]: Foo [F [B ]] = null
36+ }
37+ }
38+
39+ object K1L {
40+ class Foo [T ]
41+
42+ class Bar [F [_ >: Int ]]
43+ object Bar {
44+ implicit def barF [F [_ >: Int ]](implicit fooF : Foo [Bar [F ]]): Bar [F ] = null
45+ }
46+
47+ class A [T >: Int ]
48+ object A {
49+ implicit def fooA [F [_[_ >: Int ]]](implicit barB : F [B ]): Foo [F [A ]] = null
50+ }
51+
52+ class B [T >: Int ]
53+ object B {
54+ implicit def fooB [F [_[_ >: Int ]]]: Foo [F [B ]] = null
55+ }
56+ }
57+
58+ object K11 {
59+ class Foo [T ]
60+
61+ class Bar [F [_[_]]]
62+ object Bar {
63+ implicit def barF [F [_[_]]](implicit fooF : Foo [Bar [F ]]): Bar [F ] = null
64+ }
65+
66+ class A [T [_]]
67+ object A {
68+ implicit def fooA [F [_[_[_]]]](implicit barB : F [B ]): Foo [F [A ]] = null
69+ }
70+
71+ class B [T [_]]
72+ object B {
73+ implicit def fooB [F [_[_[_]]]]: Foo [F [B ]] = null
74+ }
75+ }
76+
77+ object K2 {
78+ class Foo [T ]
79+
80+ class Bar [F [_, _]]
81+ object Bar {
82+ implicit def barF [F [_, _]](implicit fooF : Foo [Bar [F ]]): Bar [F ] = null
83+ }
84+
85+ class A [T , U ]
86+ object A {
87+ implicit def fooA [F [_[_, _]]](implicit barB : F [B ]): Foo [F [A ]] = null
88+ }
89+
90+ class B [T , U ]
91+ object B {
92+ implicit def fooB [F [_[_, _]]]: Foo [F [B ]] = null
93+ }
94+ }
95+
96+ object Test {
97+ {
98+ import K1 ._
99+ implicitly[Bar [A ]]
100+ }
101+
102+ {
103+ import K1U ._
104+ implicitly[Bar [A ]]
105+ }
106+
107+ {
108+ import K1L ._
109+ implicitly[Bar [A ]]
110+ }
111+
112+ {
113+ import K11 ._
114+ implicitly[Bar [A ]]
115+ }
116+
117+ {
118+ import K2 ._
119+ implicitly[Bar [A ]]
120+ }
121+ }
You can’t perform that action at this time.
0 commit comments