From ad7e33efee023822bd63fa6f942c25582ef12a1e Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Sun, 11 Jan 2015 20:53:24 +0530 Subject: [PATCH] Feature gate #[rustc_on_unimplemented] --- src/libcore/lib.rs | 1 + src/librustc/middle/traits/error_reporting.rs | 5 ++--- src/libsyntax/feature_gate.rs | 5 +++++ src/test/compile-fail/on-unimplemented-bad-anno.rs | 4 +++- src/test/compile-fail/on-unimplemented.rs | 2 ++ 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs index 28f8cf588be..78e8a2a9e91 100644 --- a/src/libcore/lib.rs +++ b/src/libcore/lib.rs @@ -63,6 +63,7 @@ #![feature(simd, unsafe_destructor, slicing_syntax)] #![feature(unboxed_closures)] #![allow(unknown_features)] #![feature(int_uint)] +#![feature(on_unimplemented)] #![deny(missing_docs)] #[macro_use] diff --git a/src/librustc/middle/traits/error_reporting.rs b/src/librustc/middle/traits/error_reporting.rs index da3b5f635e1..6b4dd101286 100644 --- a/src/librustc/middle/traits/error_reporting.rs +++ b/src/librustc/middle/traits/error_reporting.rs @@ -181,9 +181,8 @@ pub fn report_selection_error<'a, 'tcx>(infcx: &InferCtxt<'a, 'tcx>, let custom_note = report_on_unimplemented(infcx, &*trait_ref.0, obligation.cause.span); if let Some(s) = custom_note { - infcx.tcx.sess.span_note( - obligation.cause.span, - s.as_slice()); + infcx.tcx.sess.span_note(obligation.cause.span, + s.as_slice()); } } } diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 8175c0a9eec..8929bbe0232 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -71,6 +71,7 @@ static KNOWN_FEATURES: &'static [(&'static str, Status)] = &[ ("visible_private_types", Active), ("slicing_syntax", Active), ("box_syntax", Active), + ("on_unimplemented", Active), ("if_let", Accepted), ("while_let", Accepted), @@ -249,6 +250,10 @@ impl<'a, 'v> Visitor<'v> for PostExpansionVisitor<'a> { self.gate_feature("linkage", i.span, "the `linkage` attribute is experimental \ and not portable across platforms") + } else if attr.name() == "rustc_on_unimplemented" { + self.gate_feature("on_unimplemented", i.span, + "the `#[rustc_on_unimplemented]` attribute \ + is an experimental feature") } } match i.node { diff --git a/src/test/compile-fail/on-unimplemented-bad-anno.rs b/src/test/compile-fail/on-unimplemented-bad-anno.rs index ec825c13043..3bd3f517dbc 100644 --- a/src/test/compile-fail/on-unimplemented-bad-anno.rs +++ b/src/test/compile-fail/on-unimplemented-bad-anno.rs @@ -9,7 +9,9 @@ // except according to those terms. // ignore-tidy-linelength -#[allow(unused)] +#![feature(on_unimplemented)] + +#![allow(unused)] #[rustc_on_unimplemented = "test error `{Self}` with `{Bar}` `{Baz}` `{Quux}`"] trait Foo{} diff --git a/src/test/compile-fail/on-unimplemented.rs b/src/test/compile-fail/on-unimplemented.rs index 7d579fb340a..7b406afcf1f 100644 --- a/src/test/compile-fail/on-unimplemented.rs +++ b/src/test/compile-fail/on-unimplemented.rs @@ -9,6 +9,8 @@ // except according to those terms. // ignore-tidy-linelength +#![feature(on_unimplemented)] + #[rustc_on_unimplemented = "test error `{Self}` with `{Bar}` `{Baz}` `{Quux}`"] trait Foo{}