11//@ run-pass 
22#![ feature( arbitrary_self_types) ]  
33
4+ // When probing for methods, we step forward through a chain of types. The first 
5+ // few of those steps can be reached by jumping through the chain of Derefs or the 
6+ // chain of Receivers. Later steps can only be reached by following the chain of 
7+ // Receivers. For instance, supposing A and B implement both Receiver and Deref, 
8+ // while C and D implement only Receiver: 
9+ // 
10+ // Type A<B<C<D<E>>>> 
11+ // 
12+ //     Deref chain:      A -> B -> C 
13+ //     Receiver chain:   A -> B -> C -> D -> E 
14+ // 
15+ // We report bad type errors from the end of the chain. But at the end of which 
16+ // chain? We never morph the type as far as E so the correct behavior is to 
17+ // report errors from point C, i.e. the end of the Deref chain. This test case 
18+ // ensures we do that. 
19+ 
420struct  MyNonNull < T > ( * const  T ) ; 
521
622impl < T >  std:: ops:: Receiver  for  MyNonNull < T >  { 
@@ -10,7 +26,13 @@ impl<T> std::ops::Receiver for MyNonNull<T> {
1026#[ allow( dead_code) ]  
1127impl < T >  MyNonNull < T >  { 
1228    fn  foo < U > ( & self )  -> * const  U  { 
13-         self . cast :: < U > ( ) . bar ( ) 
29+         let  mnn = self . cast :: < U > ( ) ; 
30+         // The following method call is the point of this test. 
31+         // If probe.rs reported errors from the last type discovered 
32+         // in the Receiver chain, it would be sad here because U is just 
33+         // a type variable. But this is a valid call so it ensures 
34+         // probe.rs doesn't make that mistake. 
35+         mnn. bar ( ) 
1436    } 
1537    fn  cast < U > ( & self )  -> MyNonNull < U >  { 
1638        MyNonNull ( self . 0  as  * const  U ) 
0 commit comments