https://doc.rust-lang.org/reference.html#statements
"##,
-E0317: r##"
-User-defined types or type parameters cannot shadow the primitive types.
-This error indicates you tried to define a type, struct or enum with the same
-name as an existing primitive type:
-
-```compile_fail
-struct u8 {
- // ...
-}
-```
-
-To fix this, simply name it something else.
-
-Such an error may also occur if you define a type parameter which shadows a
-primitive type. An example would be something like:
-
-```compile_fail
-impl<u8> MyTrait for Option<u8> {
- // ...
-}
-```
-
-In such a case, if you meant for `u8` to be a generic type parameter (i.e. any
-type can be used in its place), use something like `T` instead:
-
-```ignore
-impl<T> MyTrait for Option<T> {
- // ...
-}
-```
-
-On the other hand, if you wished to refer to the specific type `u8`, remove it
-from the type parameter list:
-
-```ignore
-impl MyTrait for Option<u8> {
- // ...
-}
-
-See the Types section of the reference for more information about the primitive
-types:
-
-https://doc.rust-lang.org/reference.html#types
-"##,
-
E0364: r##"
Private items cannot be publicly re-exported. This error indicates that you
attempted to `pub use` a type or value that was not itself public.
intravisit::walk_crate(self, krate);
}
- fn check_if_primitive_type_name(&self, name: Name, span: Span) {
- if let Some(_) = self.primitive_type_table.primitive_types.get(&name) {
- span_err!(self.session,
- span,
- E0317,
- "user-defined types or type parameters cannot shadow the primitive types");
- }
- }
-
fn resolve_item(&mut self, item: &Item) {
let name = item.name;
ItemEnum(_, ref generics) |
ItemTy(_, ref generics) |
ItemStruct(_, ref generics) => {
- self.check_if_primitive_type_name(name, item.span);
-
self.with_type_parameter_rib(HasTypeParameters(generics, TypeSpace, ItemRibKind),
|this| intravisit::walk_item(this, item));
}
}
ItemTrait(_, ref generics, ref bounds, ref trait_items) => {
- self.check_if_primitive_type_name(name, item.span);
-
// Create a new rib for the trait-wide type parameters.
self.with_type_parameter_rib(HasTypeParameters(generics,
TypeSpace,
});
}
hir::TypeTraitItem(..) => {
- this.check_if_primitive_type_name(trait_item.name,
- trait_item.span);
this.with_type_parameter_rib(NoTypeParameters, |this| {
intravisit::walk_trait_item(this, trait_item)
});
}
ItemUse(ref view_path) => {
- // check for imports shadowing primitive types
- let check_rename = |this: &Self, id, name| {
- match this.def_map.borrow().get(&id).map(|d| d.full_def()) {
- Some(Def::Enum(..)) | Some(Def::TyAlias(..)) | Some(Def::Struct(..)) |
- Some(Def::Trait(..)) | None => {
- this.check_if_primitive_type_name(name, item.span);
- }
- _ => {}
- }
- };
-
match view_path.node {
- hir::ViewPathSimple(name, _) => {
- check_rename(self, item.id, name);
- }
hir::ViewPathList(ref prefix, ref items) => {
- for item in items {
- if let Some(name) = item.node.rename() {
- check_rename(self, item.node.id(), name);
- }
- }
-
// Resolve prefix of an import with empty braces (issue #28388)
if items.is_empty() && !prefix.segments.is_empty() {
match self.resolve_crate_relative_path(prefix.span,
}
fn resolve_generics(&mut self, generics: &Generics) {
- for type_parameter in generics.ty_params.iter() {
- self.check_if_primitive_type_name(type_parameter.name, type_parameter.span);
- }
for predicate in &generics.where_clause.predicates {
match predicate {
&hir::WherePredicate::BoundPredicate(_) |
-> Option<LocalDef> {
let def = self.resolve_identifier(identifier, namespace, check_ribs, record_used);
match def {
- None | Some(LocalDef{def: Def::Mod(..), ..}) => {
+ None | Some(LocalDef{def: Def::Mod(..), ..}) if namespace == TypeNS => {
if let Some(&prim_ty) = self.primitive_type_table
.primitive_types
.get(&identifier.unhygienic_name) {
+++ /dev/null
-// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-// aux-build:i8.rs
-extern crate i8;
-use std::string as i16;
-static i32: i32 = 0;
-const i64: i64 = 0;
-fn u8(f32: f32) {}
-fn f<f64>(f64: f64) {}
-//~^ ERROR user-defined types or type parameters cannot shadow the primitive types
-type u16 = u16; //~ ERROR user-defined types or type parameters cannot shadow the primitive types
-//~^ ERROR unsupported cyclic reference between types/traits detected
-enum u32 {} //~ ERROR user-defined types or type parameters cannot shadow the primitive types
-struct u64; //~ ERROR user-defined types or type parameters cannot shadow the primitive types
-trait bool {} //~ ERROR user-defined types or type parameters cannot shadow the primitive types
-
-mod char {
- extern crate i8;
- static i32_: i32 = 0;
- const i64_: i64 = 0;
- fn u8_(f32: f32) {}
- fn f_<f64_>(f64: f64_) {}
- type u16_ = u16;
- enum u32_ {}
- struct u64_;
- trait bool_ {}
- mod char_ {}
-
- mod str {
- use super::i8 as i8;
- use super::i32_ as i32;
- use super::i64_ as i64;
- use super::u8_ as u8;
- use super::f_ as f64;
- use super::u16_ as u16;
- //~^ ERROR user-defined types or type parameters cannot shadow the primitive types
- use super::u32_ as u32;
- //~^ ERROR user-defined types or type parameters cannot shadow the primitive types
- use super::u64_ as u64;
- //~^ ERROR user-defined types or type parameters cannot shadow the primitive types
- use super::bool_ as bool;
- //~^ ERROR user-defined types or type parameters cannot shadow the primitive types
- use super::{bool_ as str};
- //~^ ERROR user-defined types or type parameters cannot shadow the primitive types
- use super::char_ as char;
- }
-}
-
-trait isize_ {
- type isize; //~ ERROR user-defined types or type parameters cannot shadow the primitive types
-}
-
-fn usize<'usize>(usize: &'usize usize) -> &'usize usize { usize }
-
-fn main() {
- let bool = true;
- match bool {
- str @ true => if str { i32 as i64 } else { i64 },
- false => i64,
- };
-}
--- /dev/null
+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// aux-build:i8.rs
+extern crate i8;
+use std::string as i16;
+static i32: i32 = 0;
+const i64: i64 = 0;
+fn u8(f32: f32) {}
+fn f<f64>(f64: f64) {}
+enum u32 {}
+struct u64;
+trait bool {}
+
+mod char {
+ extern crate i8;
+ static i32_: i32 = 0;
+ const i64_: i64 = 0;
+ fn u8_(f32: f32) {}
+ fn f_<f64_>(f64: f64_) {}
+ type u16_ = u16;
+ enum u32_ {}
+ struct u64_;
+ trait bool_ {}
+ mod char_ {}
+
+ mod str {
+ use super::i8 as i8;
+ use super::i32_ as i32;
+ use super::i64_ as i64;
+ use super::u8_ as u8;
+ use super::f_ as f64;
+ use super::u16_ as u16;
+ use super::u32_ as u32;
+ use super::u64_ as u64;
+ use super::bool_ as bool;
+ use super::{bool_ as str};
+ use super::char_ as char;
+ }
+}
+
+trait isize_ {
+ type isize;
+}
+
+fn usize<'usize>(usize: &'usize usize) -> &'usize usize { usize }
+
+mod reuse {
+ use std::mem::size_of;
+
+ type u8 = u64;
+ use std::string::String as i16;
+
+ pub fn check<u16>() {
+ assert_eq!(size_of::<u8>(), 8);
+ assert_eq!(size_of::<::u64>(), 0);
+ assert_eq!(size_of::<i16>(), 3 * size_of::<*const ()>());
+ assert_eq!(size_of::<u16>(), 0);
+ }
+}
+
+fn main() {
+ let bool = true;
+ let _ = match bool {
+ str @ true => if str { i32 as i64 } else { i64 },
+ false => i64,
+ };
+
+ reuse::check::<u64>();
+}