From ff33b2733ad23d105160c4f1946d606f4ef31870 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Fri, 29 Mar 2019 14:24:14 +0100 Subject: [PATCH 1/4] Whitelist `rustc_on_unimplemented` to avoid erroneous flagging as an unused attribute. --- src/libsyntax/feature_gate.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 96c89d3176ab6..3a1f6736ebd33 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -906,7 +906,7 @@ pub const BUILTIN_ATTRIBUTES: &[(&str, AttributeType, AttributeTemplate, Attribu not currently handle destructors.", cfg_fn!(thread_local))), - ("rustc_on_unimplemented", Normal, template!(List: + ("rustc_on_unimplemented", Whitelisted, template!(List: r#"/*opt*/ message = "...", /*opt*/ label = "...", /*opt*/ note = "...""#, NameValueStr: "message"), Gated(Stability::Unstable, From 0b9669729953a94602d74887efe488f918a1ba13 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Fri, 29 Mar 2019 15:03:31 +0100 Subject: [PATCH 2/4] Regression test for incremental treatment of rustc_on_unimplemented. --- ...ssue-59523-on-implemented-is-not-unused.rs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/test/incremental/issue-59523-on-implemented-is-not-unused.rs diff --git a/src/test/incremental/issue-59523-on-implemented-is-not-unused.rs b/src/test/incremental/issue-59523-on-implemented-is-not-unused.rs new file mode 100644 index 0000000000000..3d16a1543f43a --- /dev/null +++ b/src/test/incremental/issue-59523-on-implemented-is-not-unused.rs @@ -0,0 +1,27 @@ +// We should not see the unused_attributes lint fire for +// rustc_on_unimplemented, but with this bug we are seeing it fire (on +// subsequent runs) if incremental compilation is enabled. + +// revisions: rpass1 rpass2 +// compile-pass + +#![feature(on_unimplemented)] +#![deny(unused_attributes)] + +#[rustc_on_unimplemented = "invalid"] +trait Index { + type Output: ?Sized; + fn index(&self, index: Idx) -> &Self::Output; +} + +#[rustc_on_unimplemented = "a usize is required to index into a slice"] +impl Index for [i32] { + type Output = i32; + fn index(&self, index: usize) -> &i32 { + &self[index] + } +} + +fn main() { + Index::::index(&[1, 2, 3] as &[i32], 2); +} From 7642f108e246d955252bb8225bc1847c627f046d Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Fri, 29 Mar 2019 15:04:09 +0100 Subject: [PATCH 3/4] Whitelist rustc_layout_scalar_valid_range_{start,end} so incr comp does not flag them as unused. --- src/libsyntax/feature_gate.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 3a1f6736ebd33..dcb55fb572f33 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -962,6 +962,20 @@ pub const BUILTIN_ATTRIBUTES: &[(&str, AttributeType, AttributeTemplate, Attribu is just used for rustc unit tests \ and will never be stable", cfg_fn!(rustc_attrs))), + ("rustc_layout_scalar_valid_range_start", Whitelisted, template!(List: "value"), + Gated(Stability::Unstable, + "rustc_attrs", + "the `#[rustc_layout_scalar_valid_range_start]` attribute \ + is just used to enable niche optimizations in libcore \ + and will never be stable", + cfg_fn!(rustc_attrs))), + ("rustc_layout_scalar_valid_range_end", Whitelisted, template!(List: "value"), + Gated(Stability::Unstable, + "rustc_attrs", + "the `#[rustc_layout_scalar_valid_range_end]` attribute \ + is just used to enable niche optimizations in libcore \ + and will never be stable", + cfg_fn!(rustc_attrs))), ("rustc_regions", Normal, template!(Word), Gated(Stability::Unstable, "rustc_attrs", "the `#[rustc_regions]` attribute \ From cbbd4d5f98da0c218958766355ea58d28d92f68d Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Fri, 29 Mar 2019 15:05:03 +0100 Subject: [PATCH 4/4] Regression test for incremental treatment of rustc_scalar_valid_range_{start,end}. --- ...layout-scalar-valid-range-is-not-unused.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/test/incremental/issue-59524-layout-scalar-valid-range-is-not-unused.rs diff --git a/src/test/incremental/issue-59524-layout-scalar-valid-range-is-not-unused.rs b/src/test/incremental/issue-59524-layout-scalar-valid-range-is-not-unused.rs new file mode 100644 index 0000000000000..e4802cba9b6d7 --- /dev/null +++ b/src/test/incremental/issue-59524-layout-scalar-valid-range-is-not-unused.rs @@ -0,0 +1,19 @@ +// We should not see the unused_attributes lint fire for +// rustc_layout_scalar_valid_range_start, but with this bug we are +// seeing it fire (on subsequent runs) if incremental compilation is +// enabled. + +// revisions: rpass1 rpass2 +// compile-pass + +#![feature(rustc_attrs)] +#![deny(unused_attributes)] + +#[rustc_layout_scalar_valid_range_start(10)] +#[rustc_layout_scalar_valid_range_end(30)] +struct RestrictedRange(u32); +const OKAY_RANGE: RestrictedRange = unsafe { RestrictedRange(20) }; + +fn main() { + OKAY_RANGE.0; +}