File tree 2 files changed +81
-0
lines changed
src/test/run-pass/issue-37291
2 files changed +81
-0
lines changed Original file line number Diff line number Diff line change
1
+ // Copyright 2016 The Rust Project Developers. See the COPYRIGHT
2
+ // file at the top-level directory of this distribution and at
3
+ // http://rust-lang.org/COPYRIGHT.
4
+ //
5
+ // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6
+ // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7
+ // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8
+ // option. This file may not be copied, modified, or distributed
9
+ // except according to those terms.
10
+
11
+ #![ crate_type = "lib" ]
12
+
13
+ use std:: ops:: Mul ;
14
+
15
+ pub trait A { }
16
+ pub trait B {
17
+ type AT : A ;
18
+ }
19
+ pub trait C {
20
+ type BT : B ;
21
+ }
22
+
23
+ pub struct AV ;
24
+ impl A for AV { }
25
+
26
+ pub struct BV ;
27
+ impl B for BV {
28
+ type AT = AV ;
29
+ }
30
+
31
+ pub struct CV ;
32
+ impl C for CV {
33
+ type BT = BV ;
34
+ }
35
+
36
+ pub struct WrapperB < T > ( pub T ) ;
37
+ pub struct WrapperC < T > ( pub T ) ;
38
+
39
+ impl < C1 > Mul < WrapperB < <C1 :: BT as B >:: AT > > for WrapperC < C1 >
40
+ where C1 : C
41
+ {
42
+ type Output = u8 ;
43
+ fn mul ( self , _: WrapperB < <C1 :: BT as B >:: AT > ) -> Self :: Output {
44
+ loop { }
45
+ }
46
+ }
47
+ impl < C1 > Mul < WrapperC < C1 > > for WrapperC < C1 > {
48
+ type Output = u8 ;
49
+ fn mul ( self , _: WrapperC < C1 > ) -> Self :: Output {
50
+ loop { }
51
+ }
52
+ }
Original file line number Diff line number Diff line change
1
+ // Copyright 2016 The Rust Project Developers. See the COPYRIGHT
2
+ // file at the top-level directory of this distribution and at
3
+ // http://rust-lang.org/COPYRIGHT.
4
+ //
5
+ // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6
+ // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7
+ // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8
+ // option. This file may not be copied, modified, or distributed
9
+ // except according to those terms.
10
+
11
+ // aux-build:lib.rs
12
+
13
+ // Regression test for #37291. The problem was that the starting
14
+ // environment for a specialization check was not including the
15
+ // where-clauses from the impl when attempting to normalize the impl's
16
+ // trait-ref, so things like `<C as Foo>::Item` could not resolve,
17
+ // since the `C: Foo` trait bound was not included in the environment.
18
+
19
+ extern crate lib;
20
+
21
+ use lib:: { CV , WrapperB , WrapperC } ;
22
+
23
+ fn main ( ) {
24
+ let a = WrapperC ( CV ) ;
25
+ let b = WrapperC ( CV ) ;
26
+ if false {
27
+ let _ = a * b;
28
+ }
29
+ }
You can’t perform that action at this time.
0 commit comments