diff options
Diffstat (limited to 'src')
31 files changed, 90 insertions, 1 deletions
diff --git a/src/libcore/marker.rs b/src/libcore/marker.rs index f56a9a40332..e47b99ed552 100644 --- a/src/libcore/marker.rs +++ b/src/libcore/marker.rs @@ -46,6 +46,8 @@ pub unsafe trait Send { } #[stable(feature = "rust1", since = "1.0.0")] +#[allow(unknown_lints)] +#[allow(auto_impl)] unsafe impl Send for .. { } #[stable(feature = "rust1", since = "1.0.0")] @@ -349,6 +351,8 @@ pub unsafe trait Sync { } #[stable(feature = "rust1", since = "1.0.0")] +#[allow(unknown_lints)] +#[allow(auto_impl)] unsafe impl Sync for .. { } #[stable(feature = "rust1", since = "1.0.0")] @@ -562,6 +566,8 @@ mod impls { #[lang = "freeze"] unsafe trait Freeze {} +#[allow(unknown_lints)] +#[allow(auto_impl)] unsafe impl Freeze for .. {} impl<T: ?Sized> !Freeze for UnsafeCell<T> {} diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs index 994e85d1d36..cd18ca10af0 100644 --- a/src/librustc_lint/builtin.rs +++ b/src/librustc_lint/builtin.rs @@ -56,6 +56,31 @@ use bad_style::{MethodLateContext, method_context}; pub use lint::builtin::*; declare_lint! { + pub AUTO_IMPL, + Deny, + "The form `impl Foo for .. {}` will be removed, please use `auto trait Foo {}`" +} + +#[derive(Copy, Clone)] +pub struct AutoImpl; + +impl LintPass for AutoImpl { + fn get_lints(&self) -> LintArray { + lint_array!(AUTO_IMPL) + } +} + +impl EarlyLintPass for AutoImpl { + fn check_item(&mut self, cx: &EarlyContext, item: &ast::Item) { + let msg = "The form `impl Foo for .. {}` will be removed, please use `auto trait Foo {}`"; + match item.node { + ast::ItemKind::AutoImpl(..) => cx.span_lint(AUTO_IMPL, item.span, msg), + _ => () + } + } +} + +declare_lint! { WHILE_TRUE, Warn, "suggest using `loop { }` instead of `while true { }`" diff --git a/src/librustc_lint/lib.rs b/src/librustc_lint/lib.rs index 42fcf377d65..d59d09a8a06 100644 --- a/src/librustc_lint/lib.rs +++ b/src/librustc_lint/lib.rs @@ -109,6 +109,7 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) { AnonymousParameters, IllegalFloatLiteralPattern, UnusedDocComment, + AutoImpl, ); add_early_builtin_with_new!(sess, @@ -182,6 +183,10 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) { store.register_future_incompatible(sess, vec![ FutureIncompatibleInfo { + id: LintId::of(AUTO_IMPL), + reference: "issue #13231 <https://github.com/rust-lang/rust/issues/13231>", + }, + FutureIncompatibleInfo { id: LintId::of(PRIVATE_IN_PUBLIC), reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>", }, diff --git a/src/libstd/panic.rs b/src/libstd/panic.rs index 97b09b7e2ad..385076e50dd 100644 --- a/src/libstd/panic.rs +++ b/src/libstd/panic.rs @@ -188,6 +188,8 @@ pub struct AssertUnwindSafe<T>( // * Types like Mutex/RwLock which are explicilty poisoned are unwind safe // * Our custom AssertUnwindSafe wrapper is indeed unwind safe #[stable(feature = "catch_unwind", since = "1.9.0")] +#[allow(unknown_lints)] +#[allow(auto_impl)] impl UnwindSafe for .. {} #[stable(feature = "catch_unwind", since = "1.9.0")] impl<'a, T: ?Sized> !UnwindSafe for &'a mut T {} @@ -221,6 +223,8 @@ impl<T: RefUnwindSafe + ?Sized> UnwindSafe for Arc<T> {} // only thing which doesn't implement it (which then transitively applies to // everything else). #[stable(feature = "catch_unwind", since = "1.9.0")] +#[allow(unknown_lints)] +#[allow(auto_impl)] impl RefUnwindSafe for .. {} #[stable(feature = "catch_unwind", since = "1.9.0")] impl<T: ?Sized> !RefUnwindSafe for UnsafeCell<T> {} diff --git a/src/rtstartup/rsbegin.rs b/src/rtstartup/rsbegin.rs index 8733c7436d5..d33b5248629 100644 --- a/src/rtstartup/rsbegin.rs +++ b/src/rtstartup/rsbegin.rs @@ -14,7 +14,7 @@ // When an executable or dylib image is linked, all user code and libraries are // "sandwiched" between these two object files, so code or data from rsbegin.o // become first in the respective sections of the image, whereas code and data -// from rsend.o become the last ones. This effect can be used to place symbols +// from rsend.o become the last ones. This effect can be used to place symbols // at the beginning or at the end of a section, as well as to insert any required // headers or footers. // @@ -31,11 +31,15 @@ trait Sized {} #[lang = "sync"] trait Sync {} +#[allow(unknown_lints)] +#[allow(auto_impl)] impl Sync for .. {} #[lang = "copy"] trait Copy {} #[lang = "freeze"] trait Freeze {} +#[allow(unknown_lints)] +#[allow(auto_impl)] impl Freeze for .. {} #[lang = "drop_in_place"] diff --git a/src/rtstartup/rsend.rs b/src/rtstartup/rsend.rs index a6aed3540dd..410366d0d7f 100644 --- a/src/rtstartup/rsend.rs +++ b/src/rtstartup/rsend.rs @@ -23,6 +23,8 @@ impl<T> Sync for T {} trait Copy {} #[lang = "freeze"] trait Freeze {} +#[allow(unknown_lints)] +#[allow(auto_impl)] impl Freeze for .. {} #[lang = "drop_in_place"] diff --git a/src/test/compile-fail/auto-impl-future-compat.rs b/src/test/compile-fail/auto-impl-future-compat.rs new file mode 100644 index 00000000000..295564ca6a3 --- /dev/null +++ b/src/test/compile-fail/auto-impl-future-compat.rs @@ -0,0 +1,12 @@ +// 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. + +trait Foo {} +impl Foo for .. {} diff --git a/src/test/compile-fail/coherence-default-trait-impl.rs b/src/test/compile-fail/coherence-default-trait-impl.rs index ac792d9c233..9c26b8b05f2 100644 --- a/src/test/compile-fail/coherence-default-trait-impl.rs +++ b/src/test/compile-fail/coherence-default-trait-impl.rs @@ -12,18 +12,22 @@ trait MyTrait { fn foo() {} } +#[allow(auto_impl)] impl MyTrait for .. {} //~^ ERROR redundant auto implementations of trait `MyTrait` +#[allow(auto_impl)] impl MyTrait for .. {} trait MySafeTrait {} +#[allow(auto_impl)] unsafe impl MySafeTrait for .. {} //~^ ERROR implementing the trait `MySafeTrait` is not unsafe unsafe trait MyUnsafeTrait {} +#[allow(auto_impl)] impl MyUnsafeTrait for .. {} //~^ ERROR the trait `MyUnsafeTrait` requires an `unsafe impl` declaration diff --git a/src/test/compile-fail/feature-gate-optin-builtin-traits.rs b/src/test/compile-fail/feature-gate-optin-builtin-traits.rs index 6f57266b3e1..4c5502cec18 100644 --- a/src/test/compile-fail/feature-gate-optin-builtin-traits.rs +++ b/src/test/compile-fail/feature-gate-optin-builtin-traits.rs @@ -20,6 +20,7 @@ trait DummyTrait { auto trait AutoDummyTrait {} //~^ ERROR auto traits are experimental and possibly buggy +#[allow(auto_impl)] impl DummyTrait for .. {} //~^ ERROR auto trait implementations are experimental and possibly buggy diff --git a/src/test/compile-fail/issue-23080-2.rs b/src/test/compile-fail/issue-23080-2.rs index 9d20c17674b..bf44cd53f67 100644 --- a/src/test/compile-fail/issue-23080-2.rs +++ b/src/test/compile-fail/issue-23080-2.rs @@ -17,6 +17,7 @@ unsafe trait Trait { type Output; } +#[allow(auto_impl)] unsafe impl Trait for .. {} fn call_method<T: Trait>(x: T) {} diff --git a/src/test/compile-fail/issue-23080.rs b/src/test/compile-fail/issue-23080.rs index 2e8cba87be5..1fb63391d56 100644 --- a/src/test/compile-fail/issue-23080.rs +++ b/src/test/compile-fail/issue-23080.rs @@ -19,6 +19,7 @@ unsafe trait Trait { } } +#[allow(auto_impl)] unsafe impl Trait for .. {} fn call_method<T: Trait>(x: T) { diff --git a/src/test/compile-fail/phantom-oibit.rs b/src/test/compile-fail/phantom-oibit.rs index c84927ea266..1c1cb396a54 100644 --- a/src/test/compile-fail/phantom-oibit.rs +++ b/src/test/compile-fail/phantom-oibit.rs @@ -18,6 +18,7 @@ use std::marker::{PhantomData}; unsafe trait Zen {} +#[allow(auto_impl)] unsafe impl Zen for .. {} unsafe impl<'a, T: 'a> Zen for &'a T where T: Sync {} diff --git a/src/test/compile-fail/privacy-sanity.rs b/src/test/compile-fail/privacy-sanity.rs index 933ec3837df..34082adb8f9 100644 --- a/src/test/compile-fail/privacy-sanity.rs +++ b/src/test/compile-fail/privacy-sanity.rs @@ -21,6 +21,7 @@ pub struct S { } struct Ts(pub u8); +#[allow(auto_impl)] pub impl MarkerTr for .. {} //~ ERROR unnecessary visibility qualifier pub impl Tr for S { //~ ERROR unnecessary visibility qualifier pub fn f() {} //~ ERROR unnecessary visibility qualifier @@ -49,6 +50,7 @@ const MAIN: u8 = { } struct Ts(pub u8); + #[allow(auto_impl)] pub impl MarkerTr for .. {} //~ ERROR unnecessary visibility qualifier pub impl Tr for S { //~ ERROR unnecessary visibility qualifier pub fn f() {} //~ ERROR unnecessary visibility qualifier @@ -80,6 +82,7 @@ fn main() { } struct Ts(pub u8); + #[allow(auto_impl)] pub impl MarkerTr for .. {} //~ ERROR unnecessary visibility qualifier pub impl Tr for S { //~ ERROR unnecessary visibility qualifier pub fn f() {} //~ ERROR unnecessary visibility qualifier diff --git a/src/test/compile-fail/specialization/defaultimpl/specialization-no-default-trait-implementations.rs b/src/test/compile-fail/specialization/defaultimpl/specialization-no-default-trait-implementations.rs index fdc39d319c8..cad43ffeace 100644 --- a/src/test/compile-fail/specialization/defaultimpl/specialization-no-default-trait-implementations.rs +++ b/src/test/compile-fail/specialization/defaultimpl/specialization-no-default-trait-implementations.rs @@ -13,6 +13,7 @@ trait Foo {} +#[allow(auto_impl)] default impl Foo for .. {} //~^ ERROR `default impl` is not allowed for auto trait implementations diff --git a/src/test/compile-fail/specialization/specialization-polarity.rs b/src/test/compile-fail/specialization/specialization-polarity.rs index 27a3e31491b..c97cb3f6bb7 100644 --- a/src/test/compile-fail/specialization/specialization-polarity.rs +++ b/src/test/compile-fail/specialization/specialization-polarity.rs @@ -15,6 +15,7 @@ trait Foo {} +#[allow(auto_impl)] impl Foo for .. {} impl<T> Foo for T {} @@ -22,6 +23,7 @@ impl !Foo for u8 {} //~ ERROR E0119 trait Bar {} +#[allow(auto_impl)] impl Bar for .. {} impl<T> !Bar for T {} diff --git a/src/test/compile-fail/syntaxt-default-trait-impls.rs b/src/test/compile-fail/syntaxt-default-trait-impls.rs index d4a016dfe5b..45303cbf700 100644 --- a/src/test/compile-fail/syntaxt-default-trait-impls.rs +++ b/src/test/compile-fail/syntaxt-default-trait-impls.rs @@ -12,6 +12,7 @@ trait MyAutoImpl {} +#[allow(auto_impl)] impl<T> MyAutoImpl for .. {} //~^ ERROR auto trait implementations are not allowed to have generics diff --git a/src/test/compile-fail/traits-inductive-overflow-supertrait-oibit.rs b/src/test/compile-fail/traits-inductive-overflow-supertrait-oibit.rs index fe0e583b20a..6c7928f13f8 100644 --- a/src/test/compile-fail/traits-inductive-overflow-supertrait-oibit.rs +++ b/src/test/compile-fail/traits-inductive-overflow-supertrait-oibit.rs @@ -15,6 +15,7 @@ #![feature(optin_builtin_traits)] trait Magic: Copy {} //~ ERROR E0568 +#[allow(auto_impl)] impl Magic for .. {} fn copy<T: Magic>(x: T) -> (T, T) { (x, x) } diff --git a/src/test/compile-fail/typeck-auto-trait-no-supertraits-2.rs b/src/test/compile-fail/typeck-auto-trait-no-supertraits-2.rs index f6678ac7c2d..173582ed22f 100644 --- a/src/test/compile-fail/typeck-auto-trait-no-supertraits-2.rs +++ b/src/test/compile-fail/typeck-auto-trait-no-supertraits-2.rs @@ -11,6 +11,7 @@ #![feature(optin_builtin_traits)] trait Magic : Sized where Option<Self> : Magic {} //~ ERROR E0568 +#[allow(auto_impl)] impl Magic for .. {} impl<T:Magic> Magic for T {} diff --git a/src/test/compile-fail/typeck-auto-trait-no-supertraits.rs b/src/test/compile-fail/typeck-auto-trait-no-supertraits.rs index 9497dfb39d7..6802f72504b 100644 --- a/src/test/compile-fail/typeck-auto-trait-no-supertraits.rs +++ b/src/test/compile-fail/typeck-auto-trait-no-supertraits.rs @@ -35,6 +35,7 @@ #![feature(optin_builtin_traits)] trait Magic: Copy {} //~ ERROR E0568 +#[allow(auto_impl)] impl Magic for .. {} impl<T:Magic> Magic for T {} diff --git a/src/test/compile-fail/typeck-auto-trait-no-typeparams.rs b/src/test/compile-fail/typeck-auto-trait-no-typeparams.rs index 5a852c54869..3c409d1b371 100644 --- a/src/test/compile-fail/typeck-auto-trait-no-typeparams.rs +++ b/src/test/compile-fail/typeck-auto-trait-no-typeparams.rs @@ -11,4 +11,5 @@ #![feature(optin_builtin_traits)] trait Magic<T> {} //~ ERROR E0567 +#[allow(auto_impl)] impl Magic<isize> for .. {} diff --git a/src/test/compile-fail/typeck-default-trait-impl-constituent-types-2.rs b/src/test/compile-fail/typeck-default-trait-impl-constituent-types-2.rs index 8a46d6c76c3..a837d8c9ca7 100644 --- a/src/test/compile-fail/typeck-default-trait-impl-constituent-types-2.rs +++ b/src/test/compile-fail/typeck-default-trait-impl-constituent-types-2.rs @@ -12,6 +12,7 @@ trait MyTrait {} +#[allow(auto_impl)] impl MyTrait for .. {} struct MyS; diff --git a/src/test/compile-fail/typeck-default-trait-impl-constituent-types.rs b/src/test/compile-fail/typeck-default-trait-impl-constituent-types.rs index 3d7746b369c..bed184eb4cc 100644 --- a/src/test/compile-fail/typeck-default-trait-impl-constituent-types.rs +++ b/src/test/compile-fail/typeck-default-trait-impl-constituent-types.rs @@ -12,6 +12,7 @@ trait MyTrait {} +#[allow(auto_impl)] impl MyTrait for .. {} impl<T> !MyTrait for *mut T {} diff --git a/src/test/compile-fail/typeck-default-trait-impl-negation.rs b/src/test/compile-fail/typeck-default-trait-impl-negation.rs index 8c2658b89a5..f3a6d8a342e 100644 --- a/src/test/compile-fail/typeck-default-trait-impl-negation.rs +++ b/src/test/compile-fail/typeck-default-trait-impl-negation.rs @@ -12,10 +12,12 @@ trait MyTrait {} +#[allow(auto_impl)] impl MyTrait for .. {} unsafe trait MyUnsafeTrait {} +#[allow(auto_impl)] unsafe impl MyUnsafeTrait for .. {} struct ThisImplsTrait; diff --git a/src/test/compile-fail/typeck-default-trait-impl-outside-crate.rs b/src/test/compile-fail/typeck-default-trait-impl-outside-crate.rs index 4d71517e060..da3e926d6fc 100644 --- a/src/test/compile-fail/typeck-default-trait-impl-outside-crate.rs +++ b/src/test/compile-fail/typeck-default-trait-impl-outside-crate.rs @@ -10,6 +10,7 @@ #![feature(optin_builtin_traits)] +#[allow(auto_impl)] impl Copy for .. {} //~ ERROR E0318 //~^ NOTE `Copy` trait not defined in this crate fn main() {} diff --git a/src/test/run-make/simd-ffi/simd.rs b/src/test/run-make/simd-ffi/simd.rs index 8ab8f471575..185476fb704 100644 --- a/src/test/run-make/simd-ffi/simd.rs +++ b/src/test/run-make/simd-ffi/simd.rs @@ -81,4 +81,5 @@ pub mod marker { #[lang = "freeze"] trait Freeze {} +#[allow(auto_impl)] impl Freeze for .. {} diff --git a/src/test/run-make/target-specs/foo.rs b/src/test/run-make/target-specs/foo.rs index af24c3b460b..a0feb727028 100644 --- a/src/test/run-make/target-specs/foo.rs +++ b/src/test/run-make/target-specs/foo.rs @@ -19,6 +19,7 @@ trait Sized { } #[lang = "freeze"] trait Freeze {} +#[allow(auto_impl)] impl Freeze for .. {} #[lang="start"] diff --git a/src/test/run-pass/auto-traits.rs b/src/test/run-pass/auto-traits.rs index 94fa104e5b2..752f5a11375 100644 --- a/src/test/run-pass/auto-traits.rs +++ b/src/test/run-pass/auto-traits.rs @@ -12,6 +12,7 @@ auto trait Auto {} // Redundant but accepted until we remove it. +#[allow(auto_impl)] impl Auto for .. {} unsafe auto trait AutoUnsafe {} diff --git a/src/test/run-pass/issue-29516.rs b/src/test/run-pass/issue-29516.rs index b586abc29e2..5fa0a002a10 100644 --- a/src/test/run-pass/issue-29516.rs +++ b/src/test/run-pass/issue-29516.rs @@ -11,6 +11,7 @@ #![feature(optin_builtin_traits)] trait NotSame {} +#[allow(auto_impl)] impl NotSame for .. {} impl<A> !NotSame for (A, A) {} diff --git a/src/test/rustdoc/auxiliary/rustdoc-default-impl.rs b/src/test/rustdoc/auxiliary/rustdoc-default-impl.rs index 52bd386ba59..4fd55bd482c 100644 --- a/src/test/rustdoc/auxiliary/rustdoc-default-impl.rs +++ b/src/test/rustdoc/auxiliary/rustdoc-default-impl.rs @@ -16,6 +16,7 @@ pub mod bar { pub trait Bar {} + #[allow(auto_impl)] impl Bar for .. {} pub trait Foo { diff --git a/src/test/rustdoc/auxiliary/rustdoc-impl-parts-crosscrate.rs b/src/test/rustdoc/auxiliary/rustdoc-impl-parts-crosscrate.rs index 6e8f80c8f5f..d886778278d 100644 --- a/src/test/rustdoc/auxiliary/rustdoc-impl-parts-crosscrate.rs +++ b/src/test/rustdoc/auxiliary/rustdoc-impl-parts-crosscrate.rs @@ -12,4 +12,5 @@ pub trait AnOibit {} +#[allow(auto_impl)] impl AnOibit for .. {} diff --git a/src/test/rustdoc/impl-parts.rs b/src/test/rustdoc/impl-parts.rs index 48ef4b6be66..f74f66ce729 100644 --- a/src/test/rustdoc/impl-parts.rs +++ b/src/test/rustdoc/impl-parts.rs @@ -12,6 +12,7 @@ pub trait AnOibit {} +#[allow(auto_impl)] impl AnOibit for .. {} pub struct Foo<T> { field: T } |
