File tree 9 files changed +172
-0
lines changed
tests/ui/methods/supertrait-shadowing
9 files changed +172
-0
lines changed Original file line number Diff line number Diff line change
1
+ //@ run-pass
2
+ //@ check-run-results
3
+
4
+ #![ feature( supertrait_item_shadowing) ]
5
+ #![ allow( dead_code) ]
6
+
7
+ trait A {
8
+ const CONST : i32 ;
9
+ }
10
+ impl < T > A for T {
11
+ const CONST : i32 = 1 ;
12
+ }
13
+
14
+ trait B : A {
15
+ const CONST : i32 ;
16
+ }
17
+ impl < T > B for T {
18
+ const CONST : i32 = 2 ;
19
+ }
20
+
21
+ fn main ( ) {
22
+ println ! ( "{}" , i32 :: CONST ) ;
23
+ }
Original file line number Diff line number Diff line change
1
+ 2
Original file line number Diff line number Diff line change
1
+ #![ feature( supertrait_item_shadowing) ]
2
+ #![ warn( supertrait_item_shadowing_usage) ]
3
+
4
+ struct W < T > ( T ) ;
5
+
6
+ trait Upstream {
7
+ fn hello ( & self ) { }
8
+ }
9
+ impl < T > Upstream for T { }
10
+
11
+ trait Downstream : Upstream {
12
+ fn hello ( & self ) { }
13
+ }
14
+ impl < T > Downstream for W < T > where T : Foo { }
15
+
16
+ trait Foo { }
17
+
18
+ fn main ( ) {
19
+ let x = W ( Default :: default ( ) ) ;
20
+ x. hello ( ) ;
21
+ //~^ ERROR the trait bound `i32: Foo` is not satisfied
22
+ //~| WARN trait item `hello` from `Downstream` shadows identically named item from supertrait
23
+ let _: i32 = x. 0 ;
24
+ }
Original file line number Diff line number Diff line change
1
+ warning: trait item `hello` from `Downstream` shadows identically named item from supertrait
2
+ --> $DIR/false-subtrait-after-inference.rs:20:7
3
+ |
4
+ LL | x.hello();
5
+ | ^^^^^
6
+ |
7
+ note: item from `Downstream` shadows a supertrait item
8
+ --> $DIR/false-subtrait-after-inference.rs:12:5
9
+ |
10
+ LL | fn hello(&self) {}
11
+ | ^^^^^^^^^^^^^^^
12
+ note: item from `Upstream` is shadowed by a subtrait item
13
+ --> $DIR/false-subtrait-after-inference.rs:7:5
14
+ |
15
+ LL | fn hello(&self) {}
16
+ | ^^^^^^^^^^^^^^^
17
+ note: the lint level is defined here
18
+ --> $DIR/false-subtrait-after-inference.rs:2:9
19
+ |
20
+ LL | #![warn(supertrait_item_shadowing_usage)]
21
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
22
+
23
+ error[E0277]: the trait bound `i32: Foo` is not satisfied
24
+ --> $DIR/false-subtrait-after-inference.rs:20:7
25
+ |
26
+ LL | x.hello();
27
+ | ^^^^^ the trait `Foo` is not implemented for `i32`
28
+ |
29
+ help: this trait has no implementations, consider adding one
30
+ --> $DIR/false-subtrait-after-inference.rs:16:1
31
+ |
32
+ LL | trait Foo {}
33
+ | ^^^^^^^^^
34
+ note: required for `W<i32>` to implement `Downstream`
35
+ --> $DIR/false-subtrait-after-inference.rs:14:9
36
+ |
37
+ LL | impl<T> Downstream for W<T> where T: Foo {}
38
+ | ^^^^^^^^^^ ^^^^ --- unsatisfied trait bound introduced here
39
+
40
+ error: aborting due to 1 previous error; 1 warning emitted
41
+
42
+ For more information about this error, try `rustc --explain E0277`.
Original file line number Diff line number Diff line change
1
+ //@ run-pass
2
+ //@ check-run-results
3
+
4
+ #![ feature( supertrait_item_shadowing) ]
5
+ #![ allow( dead_code) ]
6
+
7
+ mod out_of_scope {
8
+ pub trait Subtrait : super :: Supertrait {
9
+ fn hello ( & self ) {
10
+ println ! ( "subtrait" ) ;
11
+ }
12
+ }
13
+ impl < T > Subtrait for T { }
14
+ }
15
+
16
+ trait Supertrait {
17
+ fn hello ( & self ) {
18
+ println ! ( "supertrait" ) ;
19
+ }
20
+ }
21
+ impl < T > Supertrait for T { }
22
+
23
+ fn main ( ) {
24
+ ( ) . hello ( ) ;
25
+ }
Original file line number Diff line number Diff line change
1
+ supertrait
Original file line number Diff line number Diff line change
1
+ //@ check-pass
2
+
3
+ // Make sure we don't prefer a subtrait that we would've otherwise eliminated
4
+ // in `consider_probe` during method probing.
5
+
6
+ #![ feature( supertrait_item_shadowing) ]
7
+ #![ allow( dead_code) ]
8
+
9
+ struct W < T > ( T ) ;
10
+
11
+ trait Upstream {
12
+ fn hello ( & self ) { }
13
+ }
14
+ impl < T > Upstream for T { }
15
+
16
+ trait Downstream : Upstream {
17
+ fn hello ( & self ) { }
18
+ }
19
+ impl < T > Downstream for W < T > where T : Foo { }
20
+
21
+ trait Foo { }
22
+
23
+ fn main ( ) {
24
+ let x = W ( 1i32 ) ;
25
+ x. hello ( ) ;
26
+ }
Original file line number Diff line number Diff line change
1
+ //@ run-pass
2
+ //@ check-run-results
3
+
4
+ // Makes sure we can shadow with type-dependent method syntax.
5
+
6
+ #![ feature( supertrait_item_shadowing) ]
7
+ #![ allow( dead_code) ]
8
+
9
+ trait A {
10
+ fn hello ( ) {
11
+ println ! ( "A" ) ;
12
+ }
13
+ }
14
+ impl < T > A for T { }
15
+
16
+ trait B : A {
17
+ fn hello ( ) {
18
+ println ! ( "B" ) ;
19
+ }
20
+ }
21
+ impl < T > B for T { }
22
+
23
+ fn foo < T > ( ) {
24
+ T :: hello ( ) ;
25
+ }
26
+
27
+ fn main ( ) {
28
+ foo :: < ( ) > ( ) ;
29
+ }
Original file line number Diff line number Diff line change
1
+ B
You can’t perform that action at this time.
0 commit comments