@@ -1619,15 +1619,6 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
1619
1619
intravisit:: walk_crate ( self , krate) ;
1620
1620
}
1621
1621
1622
- fn check_if_primitive_type_name ( & self , name : Name , span : Span ) {
1623
- if let Some ( _) = self . primitive_type_table . primitive_types . get ( & name) {
1624
- span_err ! ( self . session,
1625
- span,
1626
- E0317 ,
1627
- "user-defined types or type parameters cannot shadow the primitive types" ) ;
1628
- }
1629
- }
1630
-
1631
1622
fn resolve_item ( & mut self , item : & Item ) {
1632
1623
let name = item. name ;
1633
1624
@@ -1637,8 +1628,6 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
1637
1628
ItemEnum ( _, ref generics) |
1638
1629
ItemTy ( _, ref generics) |
1639
1630
ItemStruct ( _, ref generics) => {
1640
- self . check_if_primitive_type_name ( name, item. span ) ;
1641
-
1642
1631
self . with_type_parameter_rib ( HasTypeParameters ( generics, TypeSpace , ItemRibKind ) ,
1643
1632
|this| intravisit:: walk_item ( this, item) ) ;
1644
1633
}
@@ -1659,8 +1648,6 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
1659
1648
}
1660
1649
1661
1650
ItemTrait ( _, ref generics, ref bounds, ref trait_items) => {
1662
- self . check_if_primitive_type_name ( name, item. span ) ;
1663
-
1664
1651
// Create a new rib for the trait-wide type parameters.
1665
1652
self . with_type_parameter_rib ( HasTypeParameters ( generics,
1666
1653
TypeSpace ,
@@ -1695,8 +1682,6 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
1695
1682
} ) ;
1696
1683
}
1697
1684
hir:: TypeTraitItem ( ..) => {
1698
- this. check_if_primitive_type_name ( trait_item. name ,
1699
- trait_item. span ) ;
1700
1685
this. with_type_parameter_rib ( NoTypeParameters , |this| {
1701
1686
intravisit:: walk_trait_item ( this, trait_item)
1702
1687
} ) ;
@@ -1720,28 +1705,8 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
1720
1705
}
1721
1706
1722
1707
ItemUse ( ref view_path) => {
1723
- // check for imports shadowing primitive types
1724
- let check_rename = |this : & Self , id, name| {
1725
- match this. def_map . borrow ( ) . get ( & id) . map ( |d| d. full_def ( ) ) {
1726
- Some ( Def :: Enum ( ..) ) | Some ( Def :: TyAlias ( ..) ) | Some ( Def :: Struct ( ..) ) |
1727
- Some ( Def :: Trait ( ..) ) | None => {
1728
- this. check_if_primitive_type_name ( name, item. span ) ;
1729
- }
1730
- _ => { }
1731
- }
1732
- } ;
1733
-
1734
1708
match view_path. node {
1735
- hir:: ViewPathSimple ( name, _) => {
1736
- check_rename ( self , item. id , name) ;
1737
- }
1738
1709
hir:: ViewPathList ( ref prefix, ref items) => {
1739
- for item in items {
1740
- if let Some ( name) = item. node . rename ( ) {
1741
- check_rename ( self , item. node . id ( ) , name) ;
1742
- }
1743
- }
1744
-
1745
1710
// Resolve prefix of an import with empty braces (issue #28388)
1746
1711
if items. is_empty ( ) && !prefix. segments . is_empty ( ) {
1747
1712
match self . resolve_crate_relative_path ( prefix. span ,
@@ -1922,9 +1887,6 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
1922
1887
}
1923
1888
1924
1889
fn resolve_generics ( & mut self , generics : & Generics ) {
1925
- for type_parameter in generics. ty_params . iter ( ) {
1926
- self . check_if_primitive_type_name ( type_parameter. name , type_parameter. span ) ;
1927
- }
1928
1890
for predicate in & generics. where_clause . predicates {
1929
1891
match predicate {
1930
1892
& hir:: WherePredicate :: BoundPredicate ( _) |
@@ -2658,15 +2620,37 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
2658
2620
2659
2621
// Try to find a path to an item in a module.
2660
2622
let last_ident = segments. last ( ) . unwrap ( ) . identifier ;
2661
- if segments. len ( ) <= 1 {
2662
- let unqualified_def = self . resolve_identifier ( last_ident, namespace, true ) ;
2663
- return unqualified_def. and_then ( |def| self . adjust_local_def ( def, span) )
2664
- . map ( |def| {
2665
- PathResolution :: new ( def, path_depth)
2666
- } ) ;
2667
- }
2623
+ // Resolve a single identifier with fallback to primitive types
2624
+ let resolve_identifier_with_fallback = |this : & mut Self , record_used| {
2625
+ let def = this. resolve_identifier ( last_ident, namespace, record_used) ;
2626
+ match def {
2627
+ None | Some ( LocalDef { def : Def :: Mod ( ..) , ..} ) if namespace == TypeNS =>
2628
+ this. primitive_type_table
2629
+ . primitive_types
2630
+ . get ( & last_ident. unhygienic_name )
2631
+ . map_or ( def, |prim_ty| Some ( LocalDef :: from_def ( Def :: PrimTy ( * prim_ty) ) ) ) ,
2632
+ _ => def
2633
+ }
2634
+ } ;
2668
2635
2669
- let unqualified_def = self . resolve_identifier ( last_ident, namespace, false ) ;
2636
+ if segments. len ( ) == 1 {
2637
+ // In `a(::assoc_item)*` `a` cannot be a module. If `a` does resolve to a module we
2638
+ // don't report an error right away, but try to fallback to a primitive type.
2639
+ // So, we are still able to successfully resolve something like
2640
+ //
2641
+ // use std::u8; // bring module u8 in scope
2642
+ // fn f() -> u8 { // OK, resolves to primitive u8, not to std::u8
2643
+ // u8::max_value() // OK, resolves to associated function <u8>::max_value,
2644
+ // // not to non-existent std::u8::max_value
2645
+ // }
2646
+ //
2647
+ // Such behavior is required for backward compatibility.
2648
+ // The same fallback is used when `a` resolves to nothing.
2649
+ let unqualified_def = resolve_identifier_with_fallback ( self , true ) ;
2650
+ return unqualified_def. and_then ( |def| self . adjust_local_def ( def, span) ) . map ( mk_res) ;
2651
+ }
2652
+
2653
+ let unqualified_def = resolve_identifier_with_fallback ( self , false ) ;
2670
2654
let def = self . resolve_module_relative_path ( span, segments, namespace) ;
2671
2655
match ( def, unqualified_def) {
2672
2656
( Some ( d) , Some ( ref ud) ) if d == ud. def => {
@@ -2692,15 +2676,6 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
2692
2676
return Some ( LocalDef :: from_def ( Def :: Err ) ) ;
2693
2677
}
2694
2678
2695
- // First, check to see whether the name is a primitive type.
2696
- if namespace == TypeNS {
2697
- if let Some ( & prim_ty) = self . primitive_type_table
2698
- . primitive_types
2699
- . get ( & identifier. unhygienic_name ) {
2700
- return Some ( LocalDef :: from_def ( Def :: PrimTy ( prim_ty) ) ) ;
2701
- }
2702
- }
2703
-
2704
2679
self . resolve_identifier_in_local_ribs ( identifier, namespace, record_used)
2705
2680
}
2706
2681
0 commit comments