@@ -2784,6 +2784,13 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
2784
2784
visit:: walk_crate ( self , krate) ;
2785
2785
}
2786
2786
2787
+ fn check_if_primitive_type_name ( & self , name : Name , span : Span ) {
2788
+ if let Some ( _) = self . primitive_type_table . primitive_types . get ( & name) {
2789
+ span_err ! ( self . session, span, E0316 ,
2790
+ "user-defined types or type parameters cannot shadow the primitive types" ) ;
2791
+ }
2792
+ }
2793
+
2787
2794
fn resolve_item ( & mut self , item : & Item ) {
2788
2795
let name = item. ident . name ;
2789
2796
@@ -2795,6 +2802,8 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
2795
2802
// enum item: resolve all the variants' discrs,
2796
2803
// then resolve the ty params
2797
2804
ItemEnum ( ref enum_def, ref generics) => {
2805
+ self . check_if_primitive_type_name ( name, item. span ) ;
2806
+
2798
2807
for variant in & ( * enum_def) . variants {
2799
2808
if let Some ( ref dis_expr) = variant. node . disr_expr {
2800
2809
// resolve the discriminator expr
@@ -2820,6 +2829,8 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
2820
2829
}
2821
2830
2822
2831
ItemTy ( _, ref generics) => {
2832
+ self . check_if_primitive_type_name ( name, item. span ) ;
2833
+
2823
2834
self . with_type_parameter_rib ( HasTypeParameters ( generics,
2824
2835
TypeSpace ,
2825
2836
item. id ,
@@ -2843,6 +2854,8 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
2843
2854
}
2844
2855
2845
2856
ItemTrait ( _, ref generics, ref bounds, ref trait_items) => {
2857
+ self . check_if_primitive_type_name ( name, item. span ) ;
2858
+
2846
2859
// Create a new rib for the self type.
2847
2860
let mut self_type_rib = Rib :: new ( ItemRibKind ) ;
2848
2861
@@ -2915,6 +2928,8 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
2915
2928
}
2916
2929
2917
2930
ItemStruct ( ref struct_def, ref generics) => {
2931
+ self . check_if_primitive_type_name ( name, item. span ) ;
2932
+
2918
2933
self . resolve_struct ( item. id ,
2919
2934
generics,
2920
2935
& struct_def. fields [ ] ) ;
@@ -2968,7 +2983,19 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
2968
2983
} ) ;
2969
2984
}
2970
2985
2971
- ItemExternCrate ( _) | ItemUse ( _) | ItemMac ( ..) => {
2986
+ ItemUse ( ref view_path) => {
2987
+ // check for imports shadowing primitive types
2988
+ if let ast:: ViewPathSimple ( ident, _) = view_path. node {
2989
+ match self . def_map . borrow ( ) . get ( & item. id ) {
2990
+ Some ( & DefTy ( ..) ) | Some ( & DefStruct ( ..) ) | Some ( & DefTrait ( ..) ) | None => {
2991
+ self . check_if_primitive_type_name ( ident. name , item. span ) ;
2992
+ }
2993
+ _ => { }
2994
+ }
2995
+ }
2996
+ }
2997
+
2998
+ ItemExternCrate ( _) | ItemMac ( ..) => {
2972
2999
// do nothing, these are just around to be encoded
2973
3000
}
2974
3001
}
@@ -3110,6 +3137,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
3110
3137
3111
3138
fn resolve_type_parameter ( & mut self ,
3112
3139
type_parameter : & TyParam ) {
3140
+ self . check_if_primitive_type_name ( type_parameter. ident . name , type_parameter. span ) ;
3113
3141
for bound in & * type_parameter. bounds {
3114
3142
self . resolve_type_parameter_bound ( type_parameter. id , bound,
3115
3143
TraitBoundingTypeParameter ) ;
0 commit comments