| // Copyright 2013-2014 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:lint_stability.rs |
| // aux-build:inherited_stability.rs |
| // aux-build:stability_cfg1.rs |
| // aux-build:stability_cfg2.rs |
| |
| #![deny(unstable)] |
| #![deny(deprecated)] |
| #![deny(experimental)] |
| #![allow(dead_code)] |
| |
| #[macro_use] |
| extern crate lint_stability; //~ ERROR: use of unmarked item |
| |
| mod cross_crate { |
| extern crate stability_cfg1; |
| extern crate stability_cfg2; //~ ERROR: use of experimental item |
| |
| use lint_stability::*; |
| |
| fn test() { |
| let foo = MethodTester; |
| |
| deprecated(); //~ ERROR use of deprecated item |
| foo.method_deprecated(); //~ ERROR use of deprecated item |
| foo.trait_deprecated(); //~ ERROR use of deprecated item |
| |
| deprecated_text(); //~ ERROR use of deprecated item: text |
| foo.method_deprecated_text(); //~ ERROR use of deprecated item: text |
| foo.trait_deprecated_text(); //~ ERROR use of deprecated item: text |
| |
| experimental(); //~ ERROR use of experimental item |
| foo.method_experimental(); //~ ERROR use of experimental item |
| foo.trait_experimental(); //~ ERROR use of experimental item |
| |
| experimental_text(); //~ ERROR use of experimental item: text |
| foo.method_experimental_text(); //~ ERROR use of experimental item: text |
| foo.trait_experimental_text(); //~ ERROR use of experimental item: text |
| |
| unstable(); //~ ERROR use of unstable item |
| foo.method_unstable(); //~ ERROR use of unstable item |
| foo.trait_unstable(); //~ ERROR use of unstable item |
| |
| unstable_text(); //~ ERROR use of unstable item: text |
| foo.method_unstable_text(); //~ ERROR use of unstable item: text |
| foo.trait_unstable_text(); //~ ERROR use of unstable item: text |
| |
| unmarked(); //~ ERROR use of unmarked item |
| foo.method_unmarked(); //~ ERROR use of unmarked item |
| foo.trait_unmarked(); //~ ERROR use of unmarked item |
| |
| stable(); |
| foo.method_stable(); |
| foo.trait_stable(); |
| |
| stable_text(); |
| foo.method_stable_text(); |
| foo.trait_stable_text(); |
| |
| frozen(); |
| foo.method_frozen(); |
| foo.trait_frozen(); |
| |
| frozen_text(); |
| foo.method_frozen_text(); |
| foo.trait_frozen_text(); |
| |
| locked(); |
| foo.method_locked(); |
| foo.trait_locked(); |
| |
| locked_text(); |
| foo.method_locked_text(); |
| foo.trait_locked_text(); |
| |
| let _ = DeprecatedStruct { i: 0 }; //~ ERROR use of deprecated item |
| let _ = ExperimentalStruct { i: 0 }; //~ ERROR use of experimental item |
| let _ = UnstableStruct { i: 0 }; //~ ERROR use of unstable item |
| let _ = UnmarkedStruct { i: 0 }; //~ ERROR use of unmarked item |
| let _ = StableStruct { i: 0 }; |
| let _ = FrozenStruct { i: 0 }; |
| let _ = LockedStruct { i: 0 }; |
| |
| let _ = DeprecatedUnitStruct; //~ ERROR use of deprecated item |
| let _ = ExperimentalUnitStruct; //~ ERROR use of experimental item |
| let _ = UnstableUnitStruct; //~ ERROR use of unstable item |
| let _ = UnmarkedUnitStruct; //~ ERROR use of unmarked item |
| let _ = StableUnitStruct; |
| let _ = FrozenUnitStruct; |
| let _ = LockedUnitStruct; |
| |
| let _ = Enum::DeprecatedVariant; //~ ERROR use of deprecated item |
| let _ = Enum::ExperimentalVariant; //~ ERROR use of experimental item |
| let _ = Enum::UnstableVariant; //~ ERROR use of unstable item |
| let _ = Enum::UnmarkedVariant; //~ ERROR use of unmarked item |
| let _ = Enum::StableVariant; |
| let _ = Enum::FrozenVariant; |
| let _ = Enum::LockedVariant; |
| |
| let _ = DeprecatedTupleStruct (1); //~ ERROR use of deprecated item |
| let _ = ExperimentalTupleStruct (1); //~ ERROR use of experimental item |
| let _ = UnstableTupleStruct (1); //~ ERROR use of unstable item |
| let _ = UnmarkedTupleStruct (1); //~ ERROR use of unmarked item |
| let _ = StableTupleStruct (1); |
| let _ = FrozenTupleStruct (1); |
| let _ = LockedTupleStruct (1); |
| |
| // At the moment, the lint checker only checks stability in |
| // in the arguments of macros. |
| // Eventually, we will want to lint the contents of the |
| // macro in the module *defining* it. Also, stability levels |
| // on macros themselves are not yet linted. |
| macro_test!(); |
| macro_test_arg!(deprecated_text()); //~ ERROR use of deprecated item: text |
| macro_test_arg!(macro_test_arg!(deprecated_text())); //~ ERROR use of deprecated item: text |
| macro_test_arg_nested!(deprecated_text); |
| } |
| |
| fn test_method_param<F: Trait>(foo: F) { |
| foo.trait_deprecated(); //~ ERROR use of deprecated item |
| foo.trait_deprecated_text(); //~ ERROR use of deprecated item: text |
| foo.trait_experimental(); //~ ERROR use of experimental item |
| foo.trait_experimental_text(); //~ ERROR use of experimental item: text |
| foo.trait_unstable(); //~ ERROR use of unstable item |
| foo.trait_unstable_text(); //~ ERROR use of unstable item: text |
| foo.trait_unmarked(); //~ ERROR use of unmarked item |
| foo.trait_stable(); |
| } |
| |
| fn test_method_object(foo: &Trait) { |
| foo.trait_deprecated(); //~ ERROR use of deprecated item |
| foo.trait_deprecated_text(); //~ ERROR use of deprecated item: text |
| foo.trait_experimental(); //~ ERROR use of experimental item |
| foo.trait_experimental_text(); //~ ERROR use of experimental item: text |
| foo.trait_unstable(); //~ ERROR use of unstable item |
| foo.trait_unstable_text(); //~ ERROR use of unstable item: text |
| foo.trait_unmarked(); //~ ERROR use of unmarked item |
| foo.trait_stable(); |
| } |
| |
| struct S; |
| |
| impl ExperimentalTrait for S { } //~ ERROR use of experimental item |
| |
| trait LocalTrait : ExperimentalTrait { } //~ ERROR use of experimental item |
| } |
| |
| mod inheritance { |
| extern crate inherited_stability; //~ ERROR: use of experimental item |
| use self::inherited_stability::*; |
| |
| fn test_inheritance() { |
| experimental(); //~ ERROR use of experimental item |
| stable(); |
| |
| stable_mod::experimental(); //~ ERROR use of experimental item |
| stable_mod::stable(); |
| |
| unstable_mod::experimental(); //~ ERROR use of experimental item |
| unstable_mod::unstable(); //~ ERROR use of unstable item |
| |
| experimental_mod::experimental(); //~ ERROR use of experimental item |
| experimental_mod::stable(); |
| |
| let _ = Experimental::ExperimentalVariant; //~ ERROR use of experimental item |
| let _ = Experimental::StableVariant; |
| |
| let x: uint = 0; |
| x.experimental(); //~ ERROR use of experimental item |
| x.stable(); |
| } |
| } |
| |
| mod this_crate { |
| #[deprecated] |
| pub fn deprecated() {} |
| #[deprecated="text"] |
| pub fn deprecated_text() {} |
| |
| #[experimental] |
| pub fn experimental() {} |
| #[experimental="text"] |
| pub fn experimental_text() {} |
| |
| #[unstable] |
| pub fn unstable() {} |
| #[unstable="text"] |
| pub fn unstable_text() {} |
| |
| pub fn unmarked() {} |
| |
| #[stable] |
| pub fn stable() {} |
| #[stable="text"] |
| pub fn stable_text() {} |
| |
| #[locked] |
| pub fn locked() {} |
| #[locked="text"] |
| pub fn locked_text() {} |
| |
| #[frozen] |
| pub fn frozen() {} |
| #[frozen="text"] |
| pub fn frozen_text() {} |
| |
| #[stable] |
| pub struct MethodTester; |
| |
| impl MethodTester { |
| #[deprecated] |
| pub fn method_deprecated(&self) {} |
| #[deprecated="text"] |
| pub fn method_deprecated_text(&self) {} |
| |
| #[experimental] |
| pub fn method_experimental(&self) {} |
| #[experimental="text"] |
| pub fn method_experimental_text(&self) {} |
| |
| #[unstable] |
| pub fn method_unstable(&self) {} |
| #[unstable="text"] |
| pub fn method_unstable_text(&self) {} |
| |
| pub fn method_unmarked(&self) {} |
| |
| #[stable] |
| pub fn method_stable(&self) {} |
| #[stable="text"] |
| pub fn method_stable_text(&self) {} |
| |
| #[locked] |
| pub fn method_locked(&self) {} |
| #[locked="text"] |
| pub fn method_locked_text(&self) {} |
| |
| #[frozen] |
| pub fn method_frozen(&self) {} |
| #[frozen="text"] |
| pub fn method_frozen_text(&self) {} |
| } |
| |
| pub trait Trait { |
| #[deprecated] |
| fn trait_deprecated(&self) {} |
| #[deprecated="text"] |
| fn trait_deprecated_text(&self) {} |
| |
| #[experimental] |
| fn trait_experimental(&self) {} |
| #[experimental="text"] |
| fn trait_experimental_text(&self) {} |
| |
| #[unstable] |
| fn trait_unstable(&self) {} |
| #[unstable="text"] |
| fn trait_unstable_text(&self) {} |
| |
| fn trait_unmarked(&self) {} |
| |
| #[stable] |
| fn trait_stable(&self) {} |
| #[stable="text"] |
| fn trait_stable_text(&self) {} |
| |
| #[locked] |
| fn trait_locked(&self) {} |
| #[locked="text"] |
| fn trait_locked_text(&self) {} |
| |
| #[frozen] |
| fn trait_frozen(&self) {} |
| #[frozen="text"] |
| fn trait_frozen_text(&self) {} |
| } |
| |
| impl Trait for MethodTester {} |
| |
| #[deprecated] |
| pub struct DeprecatedStruct { i: isize } |
| #[experimental] |
| pub struct ExperimentalStruct { i: isize } |
| #[unstable] |
| pub struct UnstableStruct { i: isize } |
| pub struct UnmarkedStruct { i: isize } |
| #[stable] |
| pub struct StableStruct { i: isize } |
| #[frozen] |
| pub struct FrozenStruct { i: isize } |
| #[locked] |
| pub struct LockedStruct { i: isize } |
| |
| #[deprecated] |
| pub struct DeprecatedUnitStruct; |
| #[experimental] |
| pub struct ExperimentalUnitStruct; |
| #[unstable] |
| pub struct UnstableUnitStruct; |
| pub struct UnmarkedUnitStruct; |
| #[stable] |
| pub struct StableUnitStruct; |
| #[frozen] |
| pub struct FrozenUnitStruct; |
| #[locked] |
| pub struct LockedUnitStruct; |
| |
| pub enum Enum { |
| #[deprecated] |
| DeprecatedVariant, |
| #[experimental] |
| ExperimentalVariant, |
| #[unstable] |
| UnstableVariant, |
| |
| UnmarkedVariant, |
| #[stable] |
| StableVariant, |
| #[frozen] |
| FrozenVariant, |
| #[locked] |
| LockedVariant, |
| } |
| |
| #[deprecated] |
| pub struct DeprecatedTupleStruct(isize); |
| #[experimental] |
| pub struct ExperimentalTupleStruct(isize); |
| #[unstable] |
| pub struct UnstableTupleStruct(isize); |
| pub struct UnmarkedTupleStruct(isize); |
| #[stable] |
| pub struct StableTupleStruct(isize); |
| #[frozen] |
| pub struct FrozenTupleStruct(isize); |
| #[locked] |
| pub struct LockedTupleStruct(isize); |
| |
| fn test() { |
| // Only the deprecated cases of the following should generate |
| // errors, because other stability attributes now have meaning |
| // only *across* crates, not within a single crate. |
| |
| let foo = MethodTester; |
| |
| deprecated(); //~ ERROR use of deprecated item |
| foo.method_deprecated(); //~ ERROR use of deprecated item |
| foo.trait_deprecated(); //~ ERROR use of deprecated item |
| |
| deprecated_text(); //~ ERROR use of deprecated item: text |
| foo.method_deprecated_text(); //~ ERROR use of deprecated item: text |
| foo.trait_deprecated_text(); //~ ERROR use of deprecated item: text |
| |
| experimental(); |
| foo.method_experimental(); |
| foo.trait_experimental(); |
| |
| experimental_text(); |
| foo.method_experimental_text(); |
| foo.trait_experimental_text(); |
| |
| unstable(); |
| foo.method_unstable(); |
| foo.trait_unstable(); |
| |
| unstable_text(); |
| foo.method_unstable_text(); |
| foo.trait_unstable_text(); |
| |
| unmarked(); |
| foo.method_unmarked(); |
| foo.trait_unmarked(); |
| |
| stable(); |
| foo.method_stable(); |
| foo.trait_stable(); |
| |
| stable_text(); |
| foo.method_stable_text(); |
| foo.trait_stable_text(); |
| |
| frozen(); |
| foo.method_frozen(); |
| foo.trait_frozen(); |
| |
| frozen_text(); |
| foo.method_frozen_text(); |
| foo.trait_frozen_text(); |
| |
| locked(); |
| foo.method_locked(); |
| foo.trait_locked(); |
| |
| locked_text(); |
| foo.method_locked_text(); |
| foo.trait_locked_text(); |
| |
| let _ = DeprecatedStruct { i: 0 }; //~ ERROR use of deprecated item |
| let _ = ExperimentalStruct { i: 0 }; |
| let _ = UnstableStruct { i: 0 }; |
| let _ = UnmarkedStruct { i: 0 }; |
| let _ = StableStruct { i: 0 }; |
| let _ = FrozenStruct { i: 0 }; |
| let _ = LockedStruct { i: 0 }; |
| |
| let _ = DeprecatedUnitStruct; //~ ERROR use of deprecated item |
| let _ = ExperimentalUnitStruct; |
| let _ = UnstableUnitStruct; |
| let _ = UnmarkedUnitStruct; |
| let _ = StableUnitStruct; |
| let _ = FrozenUnitStruct; |
| let _ = LockedUnitStruct; |
| |
| let _ = Enum::DeprecatedVariant; //~ ERROR use of deprecated item |
| let _ = Enum::ExperimentalVariant; |
| let _ = Enum::UnstableVariant; |
| let _ = Enum::UnmarkedVariant; |
| let _ = Enum::StableVariant; |
| let _ = Enum::FrozenVariant; |
| let _ = Enum::LockedVariant; |
| |
| let _ = DeprecatedTupleStruct (1); //~ ERROR use of deprecated item |
| let _ = ExperimentalTupleStruct (1); |
| let _ = UnstableTupleStruct (1); |
| let _ = UnmarkedTupleStruct (1); |
| let _ = StableTupleStruct (1); |
| let _ = FrozenTupleStruct (1); |
| let _ = LockedTupleStruct (1); |
| } |
| |
| fn test_method_param<F: Trait>(foo: F) { |
| foo.trait_deprecated(); //~ ERROR use of deprecated item |
| foo.trait_deprecated_text(); //~ ERROR use of deprecated item: text |
| foo.trait_experimental(); |
| foo.trait_experimental_text(); |
| foo.trait_unstable(); |
| foo.trait_unstable_text(); |
| foo.trait_unmarked(); |
| foo.trait_stable(); |
| } |
| |
| fn test_method_object(foo: &Trait) { |
| foo.trait_deprecated(); //~ ERROR use of deprecated item |
| foo.trait_deprecated_text(); //~ ERROR use of deprecated item: text |
| foo.trait_experimental(); |
| foo.trait_experimental_text(); |
| foo.trait_unstable(); |
| foo.trait_unstable_text(); |
| foo.trait_unmarked(); |
| foo.trait_stable(); |
| } |
| |
| #[deprecated] |
| fn test_fn_body() { |
| fn fn_in_body() {} |
| fn_in_body(); |
| } |
| |
| impl MethodTester { |
| #[deprecated] |
| fn test_method_body(&self) { |
| fn fn_in_body() {} |
| fn_in_body(); |
| } |
| } |
| |
| #[deprecated] |
| pub trait DeprecatedTrait {} |
| |
| struct S; |
| |
| impl DeprecatedTrait for S { } //~ ERROR use of deprecated item |
| |
| trait LocalTrait : DeprecatedTrait { } //~ ERROR use of deprecated item |
| } |
| |
| fn main() {} |