File tree Expand file tree Collapse file tree 2 files changed +70
-0
lines changed 
src/test/ui/specialization Expand file tree Collapse file tree 2 files changed +70
-0
lines changed Original file line number Diff line number Diff line change 1+ // compile-fail 
2+ 
3+ #![ feature( specialization) ]  
4+ 
5+ // Test that attempting to override a non-default method or one not in the 
6+ // parent impl causes an error 
7+ 
8+ trait  Foo  { 
9+     fn  foo ( & self )  -> bool  {  true  } 
10+ } 
11+ 
12+ // Specialization tree for Foo: 
13+ // 
14+ //       Box<T>              Vec<T> 
15+ //        / \                 / \ 
16+ // Box<i32>  Box<i64>   Vec<()>  Vec<bool> 
17+ 
18+ impl < T >  Foo  for  Box < T >  { 
19+     fn  foo ( & self )  -> bool  {  false  } 
20+ } 
21+ 
22+ // Allowed 
23+ impl  Foo  for  Box < i32 >  { } 
24+ 
25+ // Can't override a non-`default` fn 
26+ impl  Foo  for  Box < i64 >  { 
27+     fn  foo ( & self )  -> bool  {  true  } 
28+     //~^ error: `foo` specializes an item from a parent `impl`, but that item is not marked `default` 
29+ } 
30+ 
31+ 
32+ // Doesn't mention the method = provided body is used and the method is final 
33+ impl < T >  Foo  for  Vec < T >  { } 
34+ 
35+ // Allowed 
36+ impl  Foo  for  Vec < ( ) >  { } 
37+ 
38+ impl  Foo  for  Vec < bool >  { 
39+     fn  foo ( & self )  -> bool  {  true  } 
40+     //~^ error: `foo` specializes an item from a parent `impl`, but that item is not marked `default` 
41+ } 
42+ 
43+ fn  main ( )  { } 
Original file line number Diff line number Diff line change 1+ error[E0520]: `foo` specializes an item from a parent `impl`, but that item is not marked `default`
2+   --> $DIR/specialization-default-methods-fail.rs:27:5
3+    |
4+ LL | / impl<T> Foo for Box<T> {
5+ LL | |     fn foo(&self) -> bool { false }
6+ LL | | }
7+    | |_- parent `impl` is here
8+ ...
9+ LL |       fn foo(&self) -> bool { true }
10+    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot specialize default item `foo`
11+    |
12+    = note: to specialize, `foo` in the parent `impl` must be marked `default`
13+ 
14+ error[E0520]: `foo` specializes an item from a parent `impl`, but that item is not marked `default`
15+   --> $DIR/specialization-default-methods-fail.rs:39:5
16+    |
17+ LL | impl<T> Foo for Vec<T> {}
18+    | ------------------------- parent `impl` is here
19+ ...
20+ LL |     fn foo(&self) -> bool { true }
21+    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot specialize default item `foo`
22+    |
23+    = note: to specialize, `foo` in the parent `impl` must be marked `default`
24+ 
25+ error: aborting due to 2 previous errors
26+ 
27+ For more information about this error, try `rustc --explain E0520`.
 
 
   
 
     
   
   
          
    
    
     
    
      
     
     
    You can’t perform that action at this time.
  
 
    
  
    
      
        
     
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments