File tree Expand file tree Collapse file tree 4 files changed +148
-0
lines changed
src/test/ui/associated-types Expand file tree Collapse file tree 4 files changed +148
-0
lines changed Original file line number Diff line number Diff line change 1+ #![ feature( associated_type_defaults) ]
2+
3+ trait MyDisplay { fn method ( & self ) { } }
4+
5+ impl < ' a , T : MyDisplay > MyDisplay for & ' a mut T { }
6+
7+ struct T ;
8+
9+ trait MPU {
10+ type MpuConfig : MyDisplay = T ;
11+ //~^ ERROR the trait bound `T: MyDisplay` is not satisfied
12+ }
13+
14+ struct S ;
15+
16+ impl MPU for S { }
17+ //~^ ERROR the trait bound `T: MyDisplay` is not satisfied
18+
19+ trait MyWrite {
20+ fn my_write ( & self , _: & dyn MyDisplay ) { }
21+ }
22+
23+ trait ProcessType {
24+ fn process_detail_fmt ( & self , _: & mut dyn MyWrite ) ;
25+ }
26+
27+ struct Process ;
28+
29+ impl ProcessType for Process {
30+ fn process_detail_fmt ( & self , writer : & mut dyn MyWrite )
31+ {
32+
33+ let mut val: Option < <S as MPU >:: MpuConfig > = None ;
34+ let valref: & mut <S as MPU >:: MpuConfig = val. as_mut ( ) . unwrap ( ) ;
35+
36+ // // This causes a different ICE (but its similar if you squint right):
37+ // //
38+ // // `Unimplemented` selecting `Binder(<T as MyDisplay>)` during codegen
39+ //
40+ // writer.my_write(valref)
41+
42+ // This one causes the ICE:
43+ // FulfillmentError(Obligation(predicate=Binder(TraitPredicate(<T as MyDisplay>)), depth=1),Unimplemented)
44+ let closure = |config : & mut <S as MPU >:: MpuConfig | writer. my_write ( & config) ;
45+ closure ( valref) ;
46+ }
47+ }
48+
49+ fn create ( ) -> & ' static dyn ProcessType {
50+ let input: Option < & mut Process > = None ;
51+ let process: & mut Process = input. unwrap ( ) ;
52+ process
53+ }
54+
55+ pub fn main ( ) {
56+ create ( ) ;
57+ }
Original file line number Diff line number Diff line change 1+ error[E0277]: the trait bound `T: MyDisplay` is not satisfied
2+ --> $DIR/issue-65774-1.rs:10:21
3+ |
4+ LL | trait MPU {
5+ | --------- required by `MPU`
6+ LL | type MpuConfig: MyDisplay = T;
7+ | ^^^^^^^^^ the trait `MyDisplay` is not implemented for `T`
8+
9+ error[E0277]: the trait bound `T: MyDisplay` is not satisfied
10+ --> $DIR/issue-65774-1.rs:16:6
11+ |
12+ LL | impl MPU for S { }
13+ | ^^^ the trait `MyDisplay` is not implemented for `T`
14+
15+ error: aborting due to 2 previous errors
16+
17+ For more information about this error, try `rustc --explain E0277`.
Original file line number Diff line number Diff line change 1+ #![ feature( associated_type_defaults) ]
2+
3+ trait MyDisplay { fn method ( & self ) { } }
4+
5+ impl < ' a , T : MyDisplay > MyDisplay for & ' a mut T { }
6+
7+ struct T ;
8+
9+ trait MPU {
10+ type MpuConfig : MyDisplay = T ;
11+ //~^ ERROR the trait bound `T: MyDisplay` is not satisfied
12+ }
13+
14+ struct S ;
15+
16+ impl MPU for S { }
17+ //~^ ERROR the trait bound `T: MyDisplay` is not satisfied
18+
19+ trait MyWrite {
20+ fn my_write ( & self , _: & dyn MyDisplay ) { }
21+ }
22+
23+ trait ProcessType {
24+ fn process_detail_fmt ( & self , _: & mut dyn MyWrite ) ;
25+ }
26+
27+ struct Process ;
28+
29+ impl ProcessType for Process {
30+ fn process_detail_fmt ( & self , writer : & mut dyn MyWrite )
31+ {
32+
33+ let mut val: Option < <S as MPU >:: MpuConfig > = None ;
34+ let valref: & mut <S as MPU >:: MpuConfig = val. as_mut ( ) . unwrap ( ) ;
35+
36+ // // This causes a different ICE (but its similar if you squint right):
37+ // //
38+ // // `Unimplemented` selecting `Binder(<T as MyDisplay>)` during codegen
39+ //
40+ writer. my_write ( valref)
41+
42+ // This one causes the ICE:
43+ // FulfillmentError(Obligation(predicate=Binder(TraitPredicate(<T as MyDisplay>)), depth=1),Unimplemented)
44+ /*let closure = |config: &mut <S as MPU>::MpuConfig| writer.my_write(&config);
45+ closure(valref);*/
46+ }
47+ }
48+
49+ fn create ( ) -> & ' static dyn ProcessType {
50+ let input: Option < & mut Process > = None ;
51+ let process: & mut Process = input. unwrap ( ) ;
52+ process
53+ }
54+
55+ pub fn main ( ) {
56+ create ( ) ;
57+ }
Original file line number Diff line number Diff line change 1+ error[E0277]: the trait bound `T: MyDisplay` is not satisfied
2+ --> $DIR/issue-65774-2.rs:10:21
3+ |
4+ LL | trait MPU {
5+ | --------- required by `MPU`
6+ LL | type MpuConfig: MyDisplay = T;
7+ | ^^^^^^^^^ the trait `MyDisplay` is not implemented for `T`
8+
9+ error[E0277]: the trait bound `T: MyDisplay` is not satisfied
10+ --> $DIR/issue-65774-2.rs:16:6
11+ |
12+ LL | impl MPU for S { }
13+ | ^^^ the trait `MyDisplay` is not implemented for `T`
14+
15+ error: aborting due to 2 previous errors
16+
17+ For more information about this error, try `rustc --explain E0277`.
You can’t perform that action at this time.
0 commit comments