@@ -510,6 +510,13 @@ pub struct NameBindings {
510
510
value_def : Option < ValueNsDef > , //< Meaning in value namespace.
511
511
}
512
512
513
+ /// Ways in which a trait can be referenced
514
+ enum TraitReferenceType {
515
+ TraitImplementation , // impl SomeTrait for T { ... }
516
+ TraitDerivation , // trait T : SomeTrait { ... }
517
+ TraitBoundingTypeParameter , // fn f<T:SomeTrait>() { ... }
518
+ }
519
+
513
520
impl NameBindings {
514
521
/// Creates a new module in this set of name bindings.
515
522
pub fn define_module ( @mut self ,
@@ -3554,23 +3561,7 @@ impl Resolver {
3554
3561
3555
3562
// Resolve derived traits.
3556
3563
for traits. iter( ) . advance |trt| {
3557
- match self . resolve_path( trt. path, TypeNS , true ,
3558
- visitor) {
3559
- None =>
3560
- self . session. span_err( trt. path. span,
3561
- "attempt to derive a \
3562
- nonexistent trait") ,
3563
- Some ( def) => {
3564
- // Write a mapping from the trait ID to the
3565
- // definition of the trait into the definition
3566
- // map.
3567
-
3568
- debug ! ( "(resolving trait) found trait def: \
3569
- %?", def) ;
3570
-
3571
- self . record_def( trt. ref_id, def) ;
3572
- }
3573
- }
3564
+ self . resolve_trait_reference( * trt, visitor, TraitDerivation ) ;
3574
3565
}
3575
3566
3576
3567
for ( * methods) . iter( ) . advance |method| {
@@ -3821,22 +3812,31 @@ impl Resolver {
3821
3812
visitor: ResolveVisitor ) {
3822
3813
match * type_parameter_bound {
3823
3814
TraitTyParamBound ( tref) => {
3824
- self . resolve_trait_reference( tref, visitor)
3815
+ self . resolve_trait_reference( tref, visitor, TraitBoundingTypeParameter )
3825
3816
}
3826
3817
RegionTyParamBound => { }
3827
3818
}
3828
3819
}
3829
3820
3830
3821
pub fn resolve_trait_reference( @mut self ,
3831
3822
trait_reference: & trait_ref,
3832
- visitor: ResolveVisitor ) {
3823
+ visitor: ResolveVisitor ,
3824
+ reference_type: TraitReferenceType ) {
3833
3825
match self . resolve_path( trait_reference. path, TypeNS , true , visitor) {
3834
3826
None => {
3835
- let idents = self . idents_to_str( trait_reference. path. idents) ;
3836
- self . session. span_err( trait_reference. path. span,
3837
- fmt ! ( "attempt to implement an unknown trait `%s`" , idents) ) ;
3827
+ let path_str = self . idents_to_str( trait_reference. path. idents) ;
3828
+
3829
+ let usage_str = match reference_type {
3830
+ TraitBoundingTypeParameter => "bound type parameter with" ,
3831
+ TraitImplementation => "implement" ,
3832
+ TraitDerivation => "derive"
3833
+ } ;
3834
+
3835
+ let msg = fmt ! ( "attempt to %s a nonexistent trait `%s`" , usage_str, path_str) ;
3836
+ self . session. span_err( trait_reference. path. span, msg) ;
3838
3837
}
3839
3838
Some ( def) => {
3839
+ debug ! ( "(resolving trait) found trait def: %?" , def) ;
3840
3840
self . record_def( trait_reference. ref_id, def) ;
3841
3841
}
3842
3842
}
@@ -3930,7 +3930,7 @@ impl Resolver {
3930
3930
let original_trait_refs;
3931
3931
match opt_trait_reference {
3932
3932
Some ( trait_reference) => {
3933
- self . resolve_trait_reference( trait_reference, visitor) ;
3933
+ self . resolve_trait_reference( trait_reference, visitor, TraitImplementation ) ;
3934
3934
3935
3935
// Record the current set of trait references.
3936
3936
let mut new_trait_refs = ~[ ] ;
0 commit comments