Rollup merge of #22803 - huonw:field-stability, r=alexcrichton
We were recording stability attributes applied to fields in the compiler, and even annotating it in the libs, but the compiler didn't actually do the checks to give errors/warnings in user crates. Details in the commit messages.
This commit is contained in:
commit
5d4e01766b
12 changed files with 575 additions and 12 deletions
|
|
@ -100,14 +100,22 @@ pub trait UnstableTrait { fn dummy(&self) { } }
|
|||
|
||||
#[stable(feature = "test_feature", since = "1.0.0")]
|
||||
#[deprecated(since = "1.0.0")]
|
||||
pub struct DeprecatedStruct { pub i: int }
|
||||
pub struct DeprecatedStruct {
|
||||
#[stable(feature = "test_feature", since = "1.0.0")] pub i: int
|
||||
}
|
||||
#[unstable(feature = "test_feature")]
|
||||
#[deprecated(since = "1.0.0")]
|
||||
pub struct DeprecatedUnstableStruct { pub i: int }
|
||||
pub struct DeprecatedUnstableStruct {
|
||||
#[stable(feature = "test_feature", since = "1.0.0")] pub i: int
|
||||
}
|
||||
#[unstable(feature = "test_feature")]
|
||||
pub struct UnstableStruct { pub i: int }
|
||||
pub struct UnstableStruct {
|
||||
#[stable(feature = "test_feature", since = "1.0.0")] pub i: int
|
||||
}
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub struct StableStruct { pub i: int }
|
||||
pub struct StableStruct {
|
||||
#[stable(feature = "test_feature", since = "1.0.0")] pub i: int
|
||||
}
|
||||
|
||||
#[stable(feature = "test_feature", since = "1.0.0")]
|
||||
#[deprecated(since = "1.0.0")]
|
||||
|
|
@ -137,14 +145,14 @@ pub enum Enum {
|
|||
|
||||
#[stable(feature = "test_feature", since = "1.0.0")]
|
||||
#[deprecated(since = "1.0.0")]
|
||||
pub struct DeprecatedTupleStruct(pub int);
|
||||
pub struct DeprecatedTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub int);
|
||||
#[unstable(feature = "test_feature")]
|
||||
#[deprecated(since = "1.0.0")]
|
||||
pub struct DeprecatedUnstableTupleStruct(pub int);
|
||||
pub struct DeprecatedUnstableTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub int);
|
||||
#[unstable(feature = "test_feature")]
|
||||
pub struct UnstableTupleStruct(pub int);
|
||||
pub struct UnstableTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub int);
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub struct StableTupleStruct(pub int);
|
||||
pub struct StableTupleStruct(#[stable(feature = "rust1", since = "1.0.0")] pub int);
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! macro_test {
|
||||
|
|
|
|||
60
src/test/auxiliary/lint_stability_fields.rs
Normal file
60
src/test/auxiliary/lint_stability_fields.rs
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
// 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.
|
||||
|
||||
#![feature(staged_api)]
|
||||
#![staged_api]
|
||||
#![stable(feature = "rust1", since = "1.0.0")]
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub struct Stable {
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub inherit: u8, // it's a lie (stable doesn't inherit)
|
||||
#[unstable(feature = "test_feature")]
|
||||
pub override1: u8,
|
||||
#[deprecated(since = "1.0.0")]
|
||||
#[unstable(feature = "test_feature")]
|
||||
pub override2: u8,
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub struct Stable2(#[stable(feature = "rust1", since = "1.0.0")] pub u8,
|
||||
#[unstable(feature = "test_feature")] pub u8,
|
||||
#[unstable(feature = "test_feature")] #[deprecated(since = "1.0.0")] pub u8);
|
||||
|
||||
#[unstable(feature = "test_feature")]
|
||||
pub struct Unstable {
|
||||
pub inherit: u8,
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub override1: u8,
|
||||
#[deprecated(since = "1.0.0")]
|
||||
#[unstable(feature = "test_feature")]
|
||||
pub override2: u8,
|
||||
}
|
||||
|
||||
#[unstable(feature = "test_feature")]
|
||||
pub struct Unstable2(pub u8,
|
||||
#[stable(feature = "rust1", since = "1.0.0")] pub u8,
|
||||
#[unstable(feature = "test_feature")] #[deprecated(since = "1.0.0")] pub u8);
|
||||
|
||||
#[unstable(feature = "test_feature")]
|
||||
#[deprecated(feature = "rust1", since = "1.0.0")]
|
||||
pub struct Deprecated {
|
||||
pub inherit: u8,
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub override1: u8,
|
||||
#[unstable(feature = "test_feature")]
|
||||
pub override2: u8,
|
||||
}
|
||||
|
||||
#[unstable(feature = "test_feature")]
|
||||
#[deprecated(feature = "rust1", since = "1.0.0")]
|
||||
pub struct Deprecated2(pub u8,
|
||||
#[stable(feature = "rust1", since = "1.0.0")] pub u8,
|
||||
#[unstable(feature = "test_feature")] pub u8);
|
||||
346
src/test/compile-fail/lint-stability-fields.rs
Normal file
346
src/test/compile-fail/lint-stability-fields.rs
Normal file
|
|
@ -0,0 +1,346 @@
|
|||
// 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:lint_stability_fields.rs
|
||||
#![deny(deprecated)]
|
||||
#![allow(dead_code)]
|
||||
#![feature(staged_api)]
|
||||
#![staged_api]
|
||||
|
||||
mod cross_crate {
|
||||
extern crate lint_stability_fields;
|
||||
|
||||
use self::lint_stability_fields::*;
|
||||
|
||||
pub fn foo() {
|
||||
let x = Stable {
|
||||
inherit: 1,
|
||||
override1: 2, //~ WARN use of unstable
|
||||
override2: 3,
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
};
|
||||
|
||||
let _ = x.inherit;
|
||||
let _ = x.override1; //~ WARN use of unstable
|
||||
let _ = x.override2;
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
|
||||
let Stable {
|
||||
inherit: _,
|
||||
override1: _, //~ WARN use of unstable
|
||||
override2: _
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
} = x;
|
||||
// all fine
|
||||
let Stable { .. } = x;
|
||||
|
||||
let x = Stable2(1, 2, 3);
|
||||
|
||||
let _ = x.0;
|
||||
let _ = x.1; //~ WARN use of unstable
|
||||
let _ = x.2;
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
|
||||
let Stable2(_,
|
||||
_, //~ WARN use of unstable
|
||||
_)
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
= x;
|
||||
// all fine
|
||||
let Stable2(..) = x;
|
||||
|
||||
|
||||
let x = Unstable { //~ WARN use of unstable
|
||||
inherit: 1, //~ WARN use of unstable
|
||||
override1: 2,
|
||||
override2: 3,
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
};
|
||||
|
||||
let _ = x.inherit; //~ WARN use of unstable
|
||||
let _ = x.override1;
|
||||
let _ = x.override2;
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
|
||||
let Unstable { //~ WARN use of unstable
|
||||
inherit: _, //~ WARN use of unstable
|
||||
override1: _,
|
||||
override2: _
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
} = x;
|
||||
|
||||
let Unstable //~ WARN use of unstable
|
||||
// the patterns are all fine:
|
||||
{ .. } = x;
|
||||
|
||||
|
||||
let x = Unstable2(1, 2, 3); //~ WARN use of unstable
|
||||
|
||||
let _ = x.0; //~ WARN use of unstable
|
||||
let _ = x.1;
|
||||
let _ = x.2;
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
|
||||
let Unstable2 //~ WARN use of unstable
|
||||
(_, //~ WARN use of unstable
|
||||
_,
|
||||
_)
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
= x;
|
||||
let Unstable2 //~ WARN use of unstable
|
||||
// the patterns are all fine:
|
||||
(..) = x;
|
||||
|
||||
|
||||
let x = Deprecated {
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
inherit: 1,
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
override1: 2,
|
||||
override2: 3, //~ WARN use of unstable
|
||||
};
|
||||
|
||||
let _ = x.inherit;
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
let _ = x.override1;
|
||||
let _ = x.override2; //~ WARN use of unstable
|
||||
|
||||
let Deprecated {
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
inherit: _,
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
override1: _,
|
||||
override2: _ //~ WARN use of unstable
|
||||
} = x;
|
||||
|
||||
let Deprecated
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
// the patterns are all fine:
|
||||
{ .. } = x;
|
||||
|
||||
let x = Deprecated2(1, 2, 3);
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
|
||||
let _ = x.0;
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
let _ = x.1;
|
||||
let _ = x.2; //~ WARN use of unstable
|
||||
|
||||
let Deprecated2
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
(_,
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
_,
|
||||
_) //~ WARN use of unstable
|
||||
= x;
|
||||
let Deprecated2
|
||||
//~^ ERROR use of deprecated item
|
||||
//~^^ WARN use of unstable
|
||||
// the patterns are all fine:
|
||||
(..) = x;
|
||||
}
|
||||
}
|
||||
|
||||
mod this_crate {
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
struct Stable {
|
||||
inherit: u8,
|
||||
#[unstable(feature = "test_feature")]
|
||||
override1: u8,
|
||||
#[deprecated(since = "1.0.0")]
|
||||
#[unstable(feature = "test_feature")]
|
||||
override2: u8,
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
struct Stable2(u8,
|
||||
#[stable(feature = "rust1", since = "1.0.0")] u8,
|
||||
#[unstable(feature = "test_feature")] #[deprecated(since = "1.0.0")] u8);
|
||||
|
||||
#[unstable(feature = "test_feature")]
|
||||
struct Unstable {
|
||||
inherit: u8,
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
override1: u8,
|
||||
#[deprecated(since = "1.0.0")]
|
||||
#[unstable(feature = "test_feature")]
|
||||
override2: u8,
|
||||
}
|
||||
|
||||
#[unstable(feature = "test_feature")]
|
||||
struct Unstable2(u8,
|
||||
#[stable(feature = "rust1", since = "1.0.0")] u8,
|
||||
#[unstable(feature = "test_feature")] #[deprecated(since = "1.0.0")] u8);
|
||||
|
||||
#[unstable(feature = "test_feature")]
|
||||
#[deprecated(feature = "rust1", since = "1.0.0")]
|
||||
struct Deprecated {
|
||||
inherit: u8,
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
override1: u8,
|
||||
#[unstable(feature = "test_feature")]
|
||||
override2: u8,
|
||||
}
|
||||
|
||||
#[unstable(feature = "test_feature")]
|
||||
#[deprecated(feature = "rust1", since = "1.0.0")]
|
||||
struct Deprecated2(u8,
|
||||
#[stable(feature = "rust1", since = "1.0.0")] u8,
|
||||
#[unstable(feature = "test_feature")] u8);
|
||||
|
||||
pub fn foo() {
|
||||
let x = Stable {
|
||||
inherit: 1,
|
||||
override1: 2,
|
||||
override2: 3,
|
||||
//~^ ERROR use of deprecated item
|
||||
};
|
||||
|
||||
let _ = x.inherit;
|
||||
let _ = x.override1;
|
||||
let _ = x.override2;
|
||||
//~^ ERROR use of deprecated item
|
||||
|
||||
let Stable {
|
||||
inherit: _,
|
||||
override1: _,
|
||||
override2: _
|
||||
//~^ ERROR use of deprecated item
|
||||
} = x;
|
||||
// all fine
|
||||
let Stable { .. } = x;
|
||||
|
||||
let x = Stable2(1, 2, 3);
|
||||
|
||||
let _ = x.0;
|
||||
let _ = x.1;
|
||||
let _ = x.2;
|
||||
//~^ ERROR use of deprecated item
|
||||
|
||||
let Stable2(_,
|
||||
_,
|
||||
_)
|
||||
//~^ ERROR use of deprecated item
|
||||
= x;
|
||||
// all fine
|
||||
let Stable2(..) = x;
|
||||
|
||||
|
||||
let x = Unstable {
|
||||
inherit: 1,
|
||||
override1: 2,
|
||||
override2: 3,
|
||||
//~^ ERROR use of deprecated item
|
||||
};
|
||||
|
||||
let _ = x.inherit;
|
||||
let _ = x.override1;
|
||||
let _ = x.override2;
|
||||
//~^ ERROR use of deprecated item
|
||||
|
||||
let Unstable {
|
||||
inherit: _,
|
||||
override1: _,
|
||||
override2: _
|
||||
//~^ ERROR use of deprecated item
|
||||
} = x;
|
||||
|
||||
let Unstable
|
||||
// the patterns are all fine:
|
||||
{ .. } = x;
|
||||
|
||||
|
||||
let x = Unstable2(1, 2, 3);
|
||||
|
||||
let _ = x.0;
|
||||
let _ = x.1;
|
||||
let _ = x.2;
|
||||
//~^ ERROR use of deprecated item
|
||||
|
||||
let Unstable2
|
||||
(_,
|
||||
_,
|
||||
_)
|
||||
//~^ ERROR use of deprecated item
|
||||
= x;
|
||||
let Unstable2
|
||||
// the patterns are all fine:
|
||||
(..) = x;
|
||||
|
||||
|
||||
let x = Deprecated {
|
||||
//~^ ERROR use of deprecated item
|
||||
inherit: 1,
|
||||
//~^ ERROR use of deprecated item
|
||||
override1: 2,
|
||||
override2: 3,
|
||||
};
|
||||
|
||||
let _ = x.inherit;
|
||||
//~^ ERROR use of deprecated item
|
||||
let _ = x.override1;
|
||||
let _ = x.override2;
|
||||
|
||||
let Deprecated {
|
||||
//~^ ERROR use of deprecated item
|
||||
inherit: _,
|
||||
//~^ ERROR use of deprecated item
|
||||
override1: _,
|
||||
override2: _
|
||||
} = x;
|
||||
|
||||
let Deprecated
|
||||
//~^ ERROR use of deprecated item
|
||||
// the patterns are all fine:
|
||||
{ .. } = x;
|
||||
|
||||
let x = Deprecated2(1, 2, 3);
|
||||
//~^ ERROR use of deprecated item
|
||||
|
||||
let _ = x.0;
|
||||
//~^ ERROR use of deprecated item
|
||||
let _ = x.1;
|
||||
let _ = x.2;
|
||||
|
||||
let Deprecated2
|
||||
//~^ ERROR use of deprecated item
|
||||
(_,
|
||||
//~^ ERROR use of deprecated item
|
||||
_,
|
||||
_)
|
||||
= x;
|
||||
let Deprecated2
|
||||
//~^ ERROR use of deprecated item
|
||||
// the patterns are all fine:
|
||||
(..) = x;
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
@ -317,11 +317,17 @@ mod this_crate {
|
|||
|
||||
#[unstable(feature = "test_feature")]
|
||||
#[deprecated(since = "1.0.0")]
|
||||
pub struct DeprecatedStruct { i: isize }
|
||||
pub struct DeprecatedStruct {
|
||||
#[stable(feature = "test_feature", since = "1.0.0")] i: isize
|
||||
}
|
||||
#[unstable(feature = "test_feature")]
|
||||
pub struct UnstableStruct { i: isize }
|
||||
pub struct UnstableStruct {
|
||||
#[stable(feature = "test_feature", since = "1.0.0")] i: isize
|
||||
}
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub struct StableStruct { i: isize }
|
||||
pub struct StableStruct {
|
||||
#[stable(feature = "test_feature", since = "1.0.0")] i: isize
|
||||
}
|
||||
|
||||
#[unstable(feature = "test_feature")]
|
||||
#[deprecated(since = "1.0.0")]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue