Turn sufficiently old compatibility lints into hard errors

This commit is contained in:
Vadim Petrochenkov
2017-05-21 14:11:08 +03:00
parent f89d8d1844
commit caecb76f08
30 changed files with 102 additions and 250 deletions

View File

@@ -130,68 +130,12 @@ declare_lint! {
"detect private items in public interfaces not caught by the old implementation" "detect private items in public interfaces not caught by the old implementation"
} }
declare_lint! {
pub INACCESSIBLE_EXTERN_CRATE,
Deny,
"use of inaccessible extern crate erroneously allowed"
}
declare_lint! {
pub INVALID_TYPE_PARAM_DEFAULT,
Deny,
"type parameter default erroneously allowed in invalid location"
}
declare_lint! {
pub ILLEGAL_FLOATING_POINT_CONSTANT_PATTERN,
Deny,
"floating-point constants cannot be used in patterns"
}
declare_lint! {
pub ILLEGAL_STRUCT_OR_ENUM_CONSTANT_PATTERN,
Deny,
"constants of struct or enum type can only be used in a pattern if \
the struct or enum has `#[derive(PartialEq, Eq)]`"
}
declare_lint! {
pub RAW_POINTER_DERIVE,
Warn,
"uses of #[derive] with raw pointers are rarely correct"
}
declare_lint! {
pub HR_LIFETIME_IN_ASSOC_TYPE,
Deny,
"binding for associated type references higher-ranked lifetime \
that does not appear in the trait input types"
}
declare_lint! {
pub OVERLAPPING_INHERENT_IMPLS,
Deny,
"two overlapping inherent impls define an item with the same name were erroneously allowed"
}
declare_lint! { declare_lint! {
pub RENAMED_AND_REMOVED_LINTS, pub RENAMED_AND_REMOVED_LINTS,
Warn, Warn,
"lints that have been renamed or removed" "lints that have been renamed or removed"
} }
declare_lint! {
pub SUPER_OR_SELF_IN_GLOBAL_PATH,
Deny,
"detects super or self keywords at the beginning of global path"
}
declare_lint! {
pub LIFETIME_UNDERSCORE,
Deny,
"lifetimes or labels named `'_` were erroneously allowed"
}
declare_lint! { declare_lint! {
pub RESOLVE_TRAIT_ON_DEFAULTED_UNIT, pub RESOLVE_TRAIT_ON_DEFAULTED_UNIT,
Warn, Warn,
@@ -280,17 +224,8 @@ impl LintPass for HardwiredLints {
TRIVIAL_CASTS, TRIVIAL_CASTS,
TRIVIAL_NUMERIC_CASTS, TRIVIAL_NUMERIC_CASTS,
PRIVATE_IN_PUBLIC, PRIVATE_IN_PUBLIC,
INACCESSIBLE_EXTERN_CRATE,
INVALID_TYPE_PARAM_DEFAULT,
ILLEGAL_FLOATING_POINT_CONSTANT_PATTERN,
ILLEGAL_STRUCT_OR_ENUM_CONSTANT_PATTERN,
CONST_ERR, CONST_ERR,
RAW_POINTER_DERIVE,
OVERLAPPING_INHERENT_IMPLS,
RENAMED_AND_REMOVED_LINTS, RENAMED_AND_REMOVED_LINTS,
SUPER_OR_SELF_IN_GLOBAL_PATH,
HR_LIFETIME_IN_ASSOC_TYPE,
LIFETIME_UNDERSCORE,
RESOLVE_TRAIT_ON_DEFAULTED_UNIT, RESOLVE_TRAIT_ON_DEFAULTED_UNIT,
SAFE_EXTERN_STATICS, SAFE_EXTERN_STATICS,
PATTERNS_IN_FNS_WITHOUT_BODY, PATTERNS_IN_FNS_WITHOUT_BODY,

View File

@@ -10,7 +10,6 @@
use eval; use eval;
use rustc::lint;
use rustc::middle::const_val::{ConstEvalErr, ConstVal}; use rustc::middle::const_val::{ConstEvalErr, ConstVal};
use rustc::mir::{Field, BorrowKind, Mutability}; use rustc::mir::{Field, BorrowKind, Mutability};
use rustc::ty::{self, TyCtxt, AdtDef, Ty, TypeVariants, Region}; use rustc::ty::{self, TyCtxt, AdtDef, Ty, TypeVariants, Region};
@@ -644,11 +643,7 @@ impl<'a, 'gcx, 'tcx> PatternContext<'a, 'gcx, 'tcx> {
debug!("expr={:?} pat_ty={:?} pat_id={}", expr, pat_ty, pat_id); debug!("expr={:?} pat_ty={:?} pat_id={}", expr, pat_ty, pat_id);
match pat_ty.sty { match pat_ty.sty {
ty::TyFloat(_) => { ty::TyFloat(_) => {
self.tcx.sess.add_lint( self.tcx.sess.span_err(span, "floating point constants cannot be used in patterns");
lint::builtin::ILLEGAL_FLOATING_POINT_CONSTANT_PATTERN,
pat_id,
span,
format!("floating point constants cannot be used in patterns"));
} }
ty::TyAdt(adt_def, _) if adt_def.is_union() => { ty::TyAdt(adt_def, _) if adt_def.is_union() => {
// Matching on union fields is unsafe, we can't hide it in constants // Matching on union fields is unsafe, we can't hide it in constants
@@ -656,15 +651,11 @@ impl<'a, 'gcx, 'tcx> PatternContext<'a, 'gcx, 'tcx> {
} }
ty::TyAdt(adt_def, _) => { ty::TyAdt(adt_def, _) => {
if !self.tcx.has_attr(adt_def.did, "structural_match") { if !self.tcx.has_attr(adt_def.did, "structural_match") {
self.tcx.sess.add_lint( let msg = format!("to use a constant of type `{}` in a pattern, \
lint::builtin::ILLEGAL_STRUCT_OR_ENUM_CONSTANT_PATTERN, `{}` must be annotated with `#[derive(PartialEq, Eq)]`",
pat_id, self.tcx.item_path_str(adt_def.did),
span, self.tcx.item_path_str(adt_def.did));
format!("to use a constant of type `{}` \ self.tcx.sess.span_err(span, &msg);
in a pattern, \
`{}` must be annotated with `#[derive(PartialEq, Eq)]`",
self.tcx.item_path_str(adt_def.did),
self.tcx.item_path_str(adt_def.did)));
} }
} }
_ => { } _ => { }

View File

@@ -179,7 +179,7 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {
// - Create a lint defaulting to warn as normal, with ideally the same error // - Create a lint defaulting to warn as normal, with ideally the same error
// message you would normally give // message you would normally give
// - Add a suitable reference, typically an RFC or tracking issue. Go ahead // - Add a suitable reference, typically an RFC or tracking issue. Go ahead
// and include the full URL. // and include the full URL, sort items in ascending order of issue numbers.
// - Later, change lint to error // - Later, change lint to error
// - Eventually, remove lint // - Eventually, remove lint
store.register_future_incompatible(sess, store.register_future_incompatible(sess,
@@ -189,48 +189,12 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {
reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>", reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>",
}, },
FutureIncompatibleInfo { FutureIncompatibleInfo {
id: LintId::of(INACCESSIBLE_EXTERN_CRATE), id: LintId::of(PATTERNS_IN_FNS_WITHOUT_BODY),
reference: "issue #36886 <https://github.com/rust-lang/rust/issues/36886>", reference: "issue #35203 <https://github.com/rust-lang/rust/issues/35203>",
},
FutureIncompatibleInfo {
id: LintId::of(INVALID_TYPE_PARAM_DEFAULT),
reference: "issue #36887 <https://github.com/rust-lang/rust/issues/36887>",
},
FutureIncompatibleInfo {
id: LintId::of(SUPER_OR_SELF_IN_GLOBAL_PATH),
reference: "issue #36888 <https://github.com/rust-lang/rust/issues/36888>",
},
FutureIncompatibleInfo {
id: LintId::of(ILLEGAL_FLOATING_POINT_CONSTANT_PATTERN),
reference: "issue #36890 <https://github.com/rust-lang/rust/issues/36890>",
},
FutureIncompatibleInfo {
id: LintId::of(ILLEGAL_FLOATING_POINT_LITERAL_PATTERN),
reference: "issue #41620 <https://github.com/rust-lang/rust/issues/41620>",
},
FutureIncompatibleInfo {
id: LintId::of(ILLEGAL_STRUCT_OR_ENUM_CONSTANT_PATTERN),
reference: "issue #36891 <https://github.com/rust-lang/rust/issues/36891>",
},
FutureIncompatibleInfo {
id: LintId::of(HR_LIFETIME_IN_ASSOC_TYPE),
reference: "issue #33685 <https://github.com/rust-lang/rust/issues/33685>",
},
FutureIncompatibleInfo {
id: LintId::of(LIFETIME_UNDERSCORE),
reference: "issue #36892 <https://github.com/rust-lang/rust/issues/36892>",
},
FutureIncompatibleInfo {
id: LintId::of(RESOLVE_TRAIT_ON_DEFAULTED_UNIT),
reference: "issue #39216 <https://github.com/rust-lang/rust/issues/39216>",
}, },
FutureIncompatibleInfo { FutureIncompatibleInfo {
id: LintId::of(SAFE_EXTERN_STATICS), id: LintId::of(SAFE_EXTERN_STATICS),
reference: "issue #36247 <https://github.com/rust-lang/rust/issues/35112>", reference: "issue #36247 <https://github.com/rust-lang/rust/issues/36247>",
},
FutureIncompatibleInfo {
id: LintId::of(PATTERNS_IN_FNS_WITHOUT_BODY),
reference: "issue #35203 <https://github.com/rust-lang/rust/issues/35203>",
}, },
FutureIncompatibleInfo { FutureIncompatibleInfo {
id: LintId::of(EXTRA_REQUIREMENT_IN_IMPL), id: LintId::of(EXTRA_REQUIREMENT_IN_IMPL),
@@ -248,18 +212,26 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {
id: LintId::of(LEGACY_CONSTRUCTOR_VISIBILITY), id: LintId::of(LEGACY_CONSTRUCTOR_VISIBILITY),
reference: "issue #39207 <https://github.com/rust-lang/rust/issues/39207>", reference: "issue #39207 <https://github.com/rust-lang/rust/issues/39207>",
}, },
FutureIncompatibleInfo {
id: LintId::of(RESOLVE_TRAIT_ON_DEFAULTED_UNIT),
reference: "issue #39216 <https://github.com/rust-lang/rust/issues/39216>",
},
FutureIncompatibleInfo { FutureIncompatibleInfo {
id: LintId::of(MISSING_FRAGMENT_SPECIFIER), id: LintId::of(MISSING_FRAGMENT_SPECIFIER),
reference: "issue #40107 <https://github.com/rust-lang/rust/issues/40107>", reference: "issue #40107 <https://github.com/rust-lang/rust/issues/40107>",
}, },
FutureIncompatibleInfo { FutureIncompatibleInfo {
id: LintId::of(PARENTHESIZED_PARAMS_IN_TYPES_AND_MODULES), id: LintId::of(ILLEGAL_FLOATING_POINT_LITERAL_PATTERN),
reference: "issue #42238 <https://github.com/rust-lang/rust/issues/42238>", reference: "issue #41620 <https://github.com/rust-lang/rust/issues/41620>",
}, },
FutureIncompatibleInfo { FutureIncompatibleInfo {
id: LintId::of(ANONYMOUS_PARAMETERS), id: LintId::of(ANONYMOUS_PARAMETERS),
reference: "issue #41686 <https://github.com/rust-lang/rust/issues/41686>", reference: "issue #41686 <https://github.com/rust-lang/rust/issues/41686>",
}, },
FutureIncompatibleInfo {
id: LintId::of(PARENTHESIZED_PARAMS_IN_TYPES_AND_MODULES),
reference: "issue #42238 <https://github.com/rust-lang/rust/issues/42238>",
}
]); ]);
// Register renamed and removed lints // Register renamed and removed lints
@@ -275,5 +247,20 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {
store.register_removed("drop_with_repr_extern", "drop flags have been removed"); store.register_removed("drop_with_repr_extern", "drop flags have been removed");
store.register_removed("transmute_from_fn_item_types", store.register_removed("transmute_from_fn_item_types",
"always cast functions before transmuting them"); "always cast functions before transmuting them");
store.register_removed("overlapping_inherent_impls", "converted into hard error, see #36889"); store.register_removed("hr_lifetime_in_assoc_type",
"converted into hard error, see https://github.com/rust-lang/rust/issues/33685");
store.register_removed("inaccessible_extern_crate",
"converted into hard error, see https://github.com/rust-lang/rust/issues/36886");
store.register_removed("invalid_type_param_default",
"converted into hard error, see https://github.com/rust-lang/rust/issues/36887");
store.register_removed("super_or_self_in_global_path",
"converted into hard error, see https://github.com/rust-lang/rust/issues/36888");
store.register_removed("overlapping_inherent_impls",
"converted into hard error, see https://github.com/rust-lang/rust/issues/36889");
store.register_removed("illegal_floating_point_constant_pattern",
"converted into hard error, see https://github.com/rust-lang/rust/issues/36890");
store.register_removed("illegal_struct_or_enum_constant_pattern",
"converted into hard error, see https://github.com/rust-lang/rust/issues/36891");
store.register_removed("lifetime_underscore",
"converted into hard error, see https://github.com/rust-lang/rust/issues/36892");
} }

View File

@@ -36,16 +36,10 @@ impl<'a> AstValidator<'a> {
&self.session.parse_sess.span_diagnostic &self.session.parse_sess.span_diagnostic
} }
fn check_label(&self, label: Ident, span: Span, id: NodeId) { fn check_label(&self, label: Ident, span: Span) {
if label.name == keywords::StaticLifetime.name() { if label.name == keywords::StaticLifetime.name() || label.name == "'_" {
self.err_handler().span_err(span, &format!("invalid label name `{}`", label.name)); self.err_handler().span_err(span, &format!("invalid label name `{}`", label.name));
} }
if label.name == "'_" {
self.session.add_lint(lint::builtin::LIFETIME_UNDERSCORE,
id,
span,
format!("invalid label name `{}`", label.name));
}
} }
fn invalid_visibility(&self, vis: &Visibility, span: Span, note: Option<&str>) { fn invalid_visibility(&self, vis: &Visibility, span: Span, note: Option<&str>) {
@@ -104,10 +98,7 @@ impl<'a> AstValidator<'a> {
impl<'a> Visitor<'a> for AstValidator<'a> { impl<'a> Visitor<'a> for AstValidator<'a> {
fn visit_lifetime(&mut self, lt: &'a Lifetime) { fn visit_lifetime(&mut self, lt: &'a Lifetime) {
if lt.ident.name == "'_" { if lt.ident.name == "'_" {
self.session.add_lint(lint::builtin::LIFETIME_UNDERSCORE, self.err_handler().span_err(lt.span, &format!("invalid lifetime name `{}`", lt.ident));
lt.id,
lt.span,
format!("invalid lifetime name `{}`", lt.ident));
} }
visit::walk_lifetime(self, lt) visit::walk_lifetime(self, lt)
@@ -121,7 +112,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
ExprKind::ForLoop(.., Some(ident)) | ExprKind::ForLoop(.., Some(ident)) |
ExprKind::Break(Some(ident), _) | ExprKind::Break(Some(ident), _) |
ExprKind::Continue(Some(ident)) => { ExprKind::Continue(Some(ident)) => {
self.check_label(ident.node, ident.span, expr.id); self.check_label(ident.node, ident.span);
} }
_ => {} _ => {}
} }
@@ -169,14 +160,12 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
visit::walk_ty(self, ty) visit::walk_ty(self, ty)
} }
fn visit_path(&mut self, path: &'a Path, id: NodeId) { fn visit_path(&mut self, path: &'a Path, _: NodeId) {
if path.segments.len() >= 2 && path.is_global() { if path.segments.len() >= 2 && path.is_global() {
let ident = path.segments[1].identifier; let ident = path.segments[1].identifier;
if token::Ident(ident).is_path_segment_keyword() { if token::Ident(ident).is_path_segment_keyword() {
self.session.add_lint(lint::builtin::SUPER_OR_SELF_IN_GLOBAL_PATH, self.err_handler()
id, .span_err(path.span, &format!("global paths cannot start with `{}`", ident));
path.span,
format!("global paths cannot start with `{}`", ident));
} }
} }

View File

@@ -1069,6 +1069,10 @@ impl<'a> NameBinding<'a> {
_ => false, _ => false,
} }
} }
fn descr(&self) -> &'static str {
if self.is_extern_crate() { "extern crate" } else { self.def().kind_name() }
}
} }
/// Interns the names of the primitive types. /// Interns the names of the primitive types.
@@ -3424,18 +3428,7 @@ impl<'a> Resolver<'a> {
for &PrivacyError(span, name, binding) in &self.privacy_errors { for &PrivacyError(span, name, binding) in &self.privacy_errors {
if !reported_spans.insert(span) { continue } if !reported_spans.insert(span) { continue }
if binding.is_extern_crate() { self.session.span_err(span, &format!("{} `{}` is private", binding.descr(), name));
// Warn when using an inaccessible extern crate.
let node_id = match binding.kind {
NameBindingKind::Import { directive, .. } => directive.id,
_ => unreachable!(),
};
let msg = format!("extern crate `{}` is private", name);
self.session.add_lint(lint::builtin::INACCESSIBLE_EXTERN_CRATE, node_id, span, msg);
} else {
let def = binding.def();
self.session.span_err(span, &format!("{} `{}` is private", def.kind_name(), name));
}
} }
} }

View File

@@ -18,7 +18,6 @@ use {names_to_string, module_to_string};
use {resolve_error, ResolutionError}; use {resolve_error, ResolutionError};
use rustc::ty; use rustc::ty;
use rustc::lint::builtin::PRIVATE_IN_PUBLIC;
use rustc::hir::def_id::DefId; use rustc::hir::def_id::DefId;
use rustc::hir::def::*; use rustc::hir::def::*;
use rustc::util::nodemap::FxHashMap; use rustc::util::nodemap::FxHashMap;
@@ -295,8 +294,7 @@ impl<'a> Resolver<'a> {
// return the corresponding binding defined by the import directive. // return the corresponding binding defined by the import directive.
pub fn import(&self, binding: &'a NameBinding<'a>, directive: &'a ImportDirective<'a>) pub fn import(&self, binding: &'a NameBinding<'a>, directive: &'a ImportDirective<'a>)
-> &'a NameBinding<'a> { -> &'a NameBinding<'a> {
let vis = if binding.pseudo_vis().is_at_least(directive.vis.get(), self) || let vis = if binding.pseudo_vis().is_at_least(directive.vis.get(), self) {
!directive.is_glob() && binding.is_extern_crate() { // c.f. `PRIVATE_IN_PUBLIC`
directive.vis.get() directive.vis.get()
} else { } else {
binding.pseudo_vis() binding.pseudo_vis()
@@ -720,13 +718,7 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> {
// All namespaces must be re-exported with extra visibility for an error to occur. // All namespaces must be re-exported with extra visibility for an error to occur.
if !any_successful_reexport { if !any_successful_reexport {
let (ns, binding) = reexport_error.unwrap(); if reexport_error.unwrap().0 == TypeNS {
if ns == TypeNS && binding.is_extern_crate() {
let msg = format!("extern crate `{}` is private, and cannot be reexported \
(error E0364), consider declaring with `pub`",
ident);
self.session.add_lint(PRIVATE_IN_PUBLIC, directive.id, directive.span, msg);
} else if ns == TypeNS {
struct_span_err!(self.session, directive.span, E0365, struct_span_err!(self.session, directive.span, E0365,
"`{}` is private, and cannot be reexported", ident) "`{}` is private, and cannot be reexported", ident)
.span_label(directive.span, format!("reexport of private `{}`", ident)) .span_label(directive.span, format!("reexport of private `{}`", ident))
@@ -792,8 +784,8 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> {
self.record_def(directive.id, PathResolution::new(module.def().unwrap())); self.record_def(directive.id, PathResolution::new(module.def().unwrap()));
} }
// Miscellaneous post-processing, including recording reexports, reporting conflicts, // Miscellaneous post-processing, including recording reexports,
// reporting the PRIVATE_IN_PUBLIC lint, and reporting unresolved imports. // reporting conflicts, and reporting unresolved imports.
fn finalize_resolutions_in(&mut self, module: Module<'b>) { fn finalize_resolutions_in(&mut self, module: Module<'b>) {
// Since import resolution is finished, globs will not define any more names. // Since import resolution is finished, globs will not define any more names.
*module.globs.borrow_mut() = Vec::new(); *module.globs.borrow_mut() = Vec::new();
@@ -838,13 +830,12 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> {
} }
match binding.kind { match binding.kind {
NameBindingKind::Import { binding: orig_binding, directive, .. } => { NameBindingKind::Import { binding: orig_binding, .. } => {
if ns == TypeNS && orig_binding.is_variant() && if ns == TypeNS && orig_binding.is_variant() &&
!orig_binding.vis.is_at_least(binding.vis, &*self) { !orig_binding.vis.is_at_least(binding.vis, &*self) {
let msg = format!("variant `{}` is private, and cannot be reexported \ let msg = format!("variant `{}` is private, and cannot be reexported, \
(error E0364), consider declaring its enum as `pub`", consider declaring its enum as `pub`", ident);
ident); self.session.span_err(binding.span, &msg);
self.session.add_lint(PRIVATE_IN_PUBLIC, directive.id, binding.span, msg);
} }
} }
NameBindingKind::Ambiguity { b1, b2, .. } NameBindingKind::Ambiguity { b1, b2, .. }

View File

@@ -54,7 +54,6 @@ There are some shortcomings in this design:
*/ */
use astconv::{AstConv, Bounds}; use astconv::{AstConv, Bounds};
use lint;
use constrained_type_params as ctp; use constrained_type_params as ctp;
use middle::lang_items::SizedTraitLangItem; use middle::lang_items::SizedTraitLangItem;
use middle::const_val::ConstVal; use middle::const_val::ConstVal;
@@ -897,12 +896,8 @@ fn generics_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
if !allow_defaults && p.default.is_some() { if !allow_defaults && p.default.is_some() {
if !tcx.sess.features.borrow().default_type_parameter_fallback { if !tcx.sess.features.borrow().default_type_parameter_fallback {
tcx.sess.add_lint( tcx.sess.span_err(p.span, "defaults for type parameters are only allowed in \
lint::builtin::INVALID_TYPE_PARAM_DEFAULT, `struct`, `enum`, `type`, or `trait` definitions.");
p.id,
p.span,
format!("defaults for type parameters are only allowed in `struct`, \
`enum`, `type`, or `trait` definitions."));
} }
} }

View File

@@ -231,20 +231,12 @@ fn mk_reexport_mod(cx: &mut TestCtxt,
-> (P<ast::Item>, Ident) { -> (P<ast::Item>, Ident) {
let super_ = Ident::from_str("super"); let super_ = Ident::from_str("super");
// Generate imports with `#[allow(private_in_public)]` to work around issue #36768.
let allow_private_in_public = cx.ext_cx.attribute(DUMMY_SP, cx.ext_cx.meta_list(
DUMMY_SP,
Symbol::intern("allow"),
vec![cx.ext_cx.meta_list_item_word(DUMMY_SP, Symbol::intern("private_in_public"))],
));
let items = tests.into_iter().map(|r| { let items = tests.into_iter().map(|r| {
cx.ext_cx.item_use_simple(DUMMY_SP, ast::Visibility::Public, cx.ext_cx.item_use_simple(DUMMY_SP, ast::Visibility::Public,
cx.ext_cx.path(DUMMY_SP, vec![super_, r])) cx.ext_cx.path(DUMMY_SP, vec![super_, r]))
.map_attrs(|_| vec![allow_private_in_public.clone()])
}).chain(tested_submods.into_iter().map(|(r, sym)| { }).chain(tested_submods.into_iter().map(|(r, sym)| {
let path = cx.ext_cx.path(DUMMY_SP, vec![super_, r, sym]); let path = cx.ext_cx.path(DUMMY_SP, vec![super_, r, sym]);
cx.ext_cx.item_use_simple_(DUMMY_SP, ast::Visibility::Public, r, path) cx.ext_cx.item_use_simple_(DUMMY_SP, ast::Visibility::Public, r, path)
.map_attrs(|_| vec![allow_private_in_public.clone()])
})).collect(); })).collect();
let reexport_mod = ast::Mod { let reexport_mod = ast::Mod {

View File

@@ -12,7 +12,6 @@
#![allow(dead_code)] #![allow(dead_code)]
#![feature(rustc_attrs)] #![feature(rustc_attrs)]
#![allow(hr_lifetime_in_assoc_type)]
trait Foo<'a> { trait Foo<'a> {
type Item; type Item;

View File

@@ -13,7 +13,6 @@
#![allow(dead_code)] #![allow(dead_code)]
#![feature(rustc_attrs)] #![feature(rustc_attrs)]
#![feature(unboxed_closures)] #![feature(unboxed_closures)]
#![deny(hr_lifetime_in_assoc_type)]
trait Foo { trait Foo {
type Item; type Item;

View File

@@ -8,21 +8,15 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
#![allow(unused)]
mod foo { mod foo {
extern crate core; extern crate core;
} }
// Check that private crates can be used from outside their modules, albeit with warnings // Check that private crates can be used from outside their modules, albeit with warnings
use foo::core; //~ WARN extern crate `core` is private
//~^ WARN this was previously accepted by the compiler but is being phased out
use foo::core::cell; //~ ERROR extern crate `core` is private use foo::core::cell; //~ ERROR extern crate `core` is private
//~^ WARN this was previously accepted by the compiler but is being phased out
fn f() { fn f() {
foo::core::cell::Cell::new(0); //~ ERROR extern crate `core` is private foo::core::cell::Cell::new(0); //~ ERROR extern crate `core` is private
//~^ WARN this was previously accepted by the compiler but is being phased out
use foo::*; use foo::*;
mod core {} // Check that private crates are not glob imported mod core {} // Check that private crates are not glob imported

View File

@@ -1,4 +1,4 @@
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT // Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at // file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT. // http://rust-lang.org/COPYRIGHT.
// //
@@ -8,18 +8,11 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
#![allow(private_in_public)] #![deny(future_incompatible)]
mod foo { trait Tr {
pub mod bar { fn f(u8) {} //~ ERROR use of deprecated anonymous parameter
extern crate core; //~^ WARN this was previously accepted
}
} }
mod baz { fn main() {}
pub use foo::bar::core;
}
fn main() {
baz::core::cell::Cell::new(0u32);
}

View File

@@ -13,7 +13,7 @@ use std::marker;
struct Foo<A, B, C = (A, B)>( struct Foo<A, B, C = (A, B)>(
marker::PhantomData<(A,B,C)>); marker::PhantomData<(A,B,C)>);
impl<A, B, C = (A, B)> Foo<A, B, C> { impl<A, B, C> Foo<A, B, C> {
fn new() -> Foo<A, B, C> {Foo(marker::PhantomData)} fn new() -> Foo<A, B, C> {Foo(marker::PhantomData)}
} }

View File

@@ -15,7 +15,7 @@ struct Heap;
struct Vec<T, A = Heap>( struct Vec<T, A = Heap>(
marker::PhantomData<(T,A)>); marker::PhantomData<(T,A)>);
impl<T, A = Heap> Vec<T, A> { impl<T, A> Vec<T, A> {
fn new() -> Vec<T, A> {Vec(marker::PhantomData)} fn new() -> Vec<T, A> {Vec(marker::PhantomData)}
} }

View File

@@ -11,7 +11,7 @@
//! Test that absolute path names are correct when a crate is not linked into the root namespace //! Test that absolute path names are correct when a crate is not linked into the root namespace
mod foo { mod foo {
extern crate core; pub extern crate core;
} }
fn assert_clone<T>() where T : Clone { } fn assert_clone<T>() where T : Clone { }

View File

@@ -11,7 +11,7 @@
//! Test that when a crate is linked multiple times that the shortest absolute path name is used //! Test that when a crate is linked multiple times that the shortest absolute path name is used
mod foo { mod foo {
extern crate core; pub extern crate core;
} }
extern crate core; extern crate core;

View File

@@ -19,13 +19,11 @@ fn main() {
let x = NAN; let x = NAN;
match x { match x {
NAN => {}, //~ ERROR floating point constants cannot be used NAN => {}, //~ ERROR floating point constants cannot be used
//~| WARNING hard error
_ => {}, _ => {},
}; };
match [x, 1.0] { match [x, 1.0] {
[NAN, _] => {}, //~ ERROR floating point constants cannot be used [NAN, _] => {}, //~ ERROR floating point constants cannot be used
//~| WARNING hard error
_ => {}, _ => {},
}; };
} }

View File

@@ -9,17 +9,13 @@
// except according to those terms. // except according to those terms.
fn _f<'_>() //~ ERROR invalid lifetime name `'_` fn _f<'_>() //~ ERROR invalid lifetime name `'_`
//~^ WARN this was previously accepted
-> &'_ u8 //~ ERROR invalid lifetime name `'_` -> &'_ u8 //~ ERROR invalid lifetime name `'_`
//~^ WARN this was previously accepted
{ {
panic!(); panic!();
} }
fn main() { fn main() {
'_: loop { //~ ERROR invalid label name `'_` '_: loop { //~ ERROR invalid label name `'_`
//~^ WARN this was previously accepted
break '_ //~ ERROR invalid label name `'_` break '_ //~ ERROR invalid label name `'_`
//~^ WARN this was previously accepted
} }
} }

View File

@@ -10,8 +10,10 @@
use self::Direction::{North, East, South, West}; use self::Direction::{North, East, South, West};
#[derive(PartialEq, Eq)]
struct NewBool(bool); struct NewBool(bool);
#[derive(PartialEq, Eq)]
enum Direction { enum Direction {
North, North,
East, East,

View File

@@ -8,7 +8,6 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
#![deny(private_in_public)]
#![allow(warnings)] #![allow(warnings)]
mod foo { mod foo {

View File

@@ -10,7 +10,6 @@
// aux-build:pub_restricted.rs // aux-build:pub_restricted.rs
#![deny(private_in_public)]
#![allow(warnings)] #![allow(warnings)]
extern crate pub_restricted; extern crate pub_restricted;

View File

@@ -18,8 +18,6 @@ mod m1 {
} }
mod m2 { mod m2 {
#![deny(future_incompatible)]
pub struct Pub; pub struct Pub;
struct Priv; struct Priv;

View File

@@ -8,31 +8,20 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
#![deny(private_in_public)]
#![allow(dead_code)]
extern crate core;
pub use core as reexported_core; //~ ERROR extern crate `core` is private, and cannot be reexported
//~^ WARNING hard error
mod m1 { mod m1 {
pub use ::E::V; //~ ERROR variant `V` is private, and cannot be reexported pub use ::E::V; //~ ERROR variant `V` is private, and cannot be reexported
//~^ WARNING hard error
} }
mod m2 { mod m2 {
pub use ::E::{V}; //~ ERROR variant `V` is private, and cannot be reexported pub use ::E::{V}; //~ ERROR variant `V` is private, and cannot be reexported
//~^ WARNING hard error
} }
mod m3 { mod m3 {
pub use ::E::V::{self}; //~ ERROR variant `V` is private, and cannot be reexported pub use ::E::V::{self}; //~ ERROR variant `V` is private, and cannot be reexported
//~^ WARNING hard error
} }
mod m4 { mod m4 {
pub use ::E::*; //~ ERROR variant `V` is private, and cannot be reexported pub use ::E::*; //~ ERROR variant `V` is private, and cannot be reexported
//~^ WARNING hard error
} }
enum E { V } enum E { V }

View File

@@ -0,0 +1,31 @@
// Copyright 2017 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.
#![allow(unused)]
extern crate core;
pub use core as reexported_core; //~ ERROR `core` is private, and cannot be reexported
mod foo1 {
extern crate core;
}
mod foo2 {
use foo1::core; //~ ERROR `core` is private, and cannot be reexported
pub mod bar {
extern crate core;
}
}
mod baz {
pub use foo2::bar::core; //~ ERROR `core` is private, and cannot be reexported
}
fn main() {}

View File

@@ -17,7 +17,6 @@ trait Tr<T = u8> {
impl Tr<Self> for S {} // OK impl Tr<Self> for S {} // OK
impl<T: Tr<Self>> Tr<T> for S {} // OK impl<T: Tr<Self>> Tr<T> for S {} // OK
impl<T = Self> Tr<T> for S {} // OK
impl Tr for S where Self: Copy {} // OK impl Tr for S where Self: Copy {} // OK
impl Tr for S where S<Self>: Copy {} // OK impl Tr for S where S<Self>: Copy {} // OK
impl Tr for S where Self::A: Copy {} // OK impl Tr for S where Self::A: Copy {} // OK

View File

@@ -16,8 +16,7 @@
// gate-test-structural_match // gate-test-structural_match
#![allow(dead_code)] #![allow(unused)]
#![deny(future_incompatible)]
#![feature(rustc_attrs)] #![feature(rustc_attrs)]
#![cfg_attr(with_gate, feature(structural_match))] #![cfg_attr(with_gate, feature(structural_match))]

View File

@@ -8,9 +8,6 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
#![allow(dead_code)]
#![deny(future_incompatible)]
use std::f32; use std::f32;
#[derive(PartialEq)] #[derive(PartialEq)]
@@ -25,7 +22,6 @@ fn main() {
match y { match y {
FOO => { } FOO => { }
//~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]` //~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]`
//~| WARNING will become a hard error
_ => { } _ => { }
} }
@@ -33,7 +29,6 @@ fn main() {
match x { match x {
f32::INFINITY => { } f32::INFINITY => { }
//~^ ERROR floating point constants cannot be used in patterns //~^ ERROR floating point constants cannot be used in patterns
//~| WARNING will become a hard error
_ => { } _ => { }
} }
} }

View File

@@ -8,9 +8,6 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
#![allow(dead_code)]
#![deny(future_incompatible)]
#[derive(Eq)] #[derive(Eq)]
struct Foo { struct Foo {
x: u32 x: u32
@@ -29,7 +26,6 @@ fn main() {
match y { match y {
FOO => { } FOO => { }
//~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]` //~^ ERROR must be annotated with `#[derive(PartialEq, Eq)]`
//~| WARNING will become a hard error
_ => { } _ => { }
} }
} }

View File

@@ -10,16 +10,11 @@
// gate-test-default_type_parameter_fallback // gate-test-default_type_parameter_fallback
#![deny(future_incompatible)]
#![allow(dead_code)]
fn avg<T=i32>(_: T) {} fn avg<T=i32>(_: T) {}
//~^ ERROR defaults for type parameters are only allowed //~^ ERROR defaults for type parameters are only allowed
//~| WARNING hard error
struct S<T>(T); struct S<T>(T);
impl<T=i32> S<T> {} impl<T=i32> S<T> {}
//~^ ERROR defaults for type parameters are only allowed //~^ ERROR defaults for type parameters are only allowed
//~| WARNING hard error
fn main() {} fn main() {}

View File

@@ -15,11 +15,9 @@ struct Z;
mod foo { mod foo {
use ::super::{S, Z}; //~ ERROR global paths cannot start with `super` use ::super::{S, Z}; //~ ERROR global paths cannot start with `super`
//~^ WARN this was previously accepted by the compiler but is being phased out
pub fn g() { pub fn g() {
use ::super::main; //~ ERROR global paths cannot start with `super` use ::super::main; //~ ERROR global paths cannot start with `super`
//~^ WARN this was previously accepted by the compiler but is being phased out
main(); main();
} }
} }