clarify the parenthetical notation stability error message

This also calls the right API, which e.g. prevents a suggestion
for #![feature(unboxed_closures)] on stable.

Fixes #26970
This commit is contained in:
Ariel Ben-Yehuda 2015-07-28 19:21:24 +03:00
parent 4c371bb6de
commit bd01175234
4 changed files with 17 additions and 19 deletions

View File

@ -69,6 +69,7 @@ use util::nodemap::FnvHashSet;
use std::slice; use std::slice;
use syntax::{abi, ast, ast_util}; use syntax::{abi, ast, ast_util};
use syntax::codemap::{Span, Pos}; use syntax::codemap::{Span, Pos};
use syntax::feature_gate::emit_feature_err;
use syntax::parse::token; use syntax::parse::token;
use syntax::print::pprust; use syntax::print::pprust;
@ -791,12 +792,11 @@ fn create_substs_for_ast_trait_ref<'a,'tcx>(this: &AstConv<'tcx>,
// For now, require that parenthetical notation be used // For now, require that parenthetical notation be used
// only with `Fn()` etc. // only with `Fn()` etc.
if !this.tcx().sess.features.borrow().unboxed_closures && trait_def.paren_sugar { if !this.tcx().sess.features.borrow().unboxed_closures && trait_def.paren_sugar {
span_err!(this.tcx().sess, span, E0215, emit_feature_err(&this.tcx().sess.parse_sess.span_diagnostic,
"angle-bracket notation is not stable when \ "unboxed_closures", span,
used with the `Fn` family of traits, use parentheses"); "\
fileline_help!(this.tcx().sess, span, the precise format of `Fn`-family traits' type parameters is \
"add `#![feature(unboxed_closures)]` to \ subject to change. Use parenthetical notation (Fn(Foo, Bar) -> Baz) instead");
the crate attributes to enable");
} }
convert_angle_bracketed_parameters(this, rscope, span, &trait_def.generics, data) convert_angle_bracketed_parameters(this, rscope, span, &trait_def.generics, data)
@ -805,12 +805,10 @@ fn create_substs_for_ast_trait_ref<'a,'tcx>(this: &AstConv<'tcx>,
// For now, require that parenthetical notation be used // For now, require that parenthetical notation be used
// only with `Fn()` etc. // only with `Fn()` etc.
if !this.tcx().sess.features.borrow().unboxed_closures && !trait_def.paren_sugar { if !this.tcx().sess.features.borrow().unboxed_closures && !trait_def.paren_sugar {
span_err!(this.tcx().sess, span, E0216, emit_feature_err(&this.tcx().sess.parse_sess.span_diagnostic,
"parenthetical notation is only stable when \ "unboxed_closures", span,
used with the `Fn` family of traits"); "\
fileline_help!(this.tcx().sess, span, parenthetical notation is only stable when used with `Fn`-family traits");
"add `#![feature(unboxed_closures)]` to \
the crate attributes to enable");
} }
convert_parenthesized_parameters(this, rscope, span, &trait_def.generics, data) convert_parenthesized_parameters(this, rscope, span, &trait_def.generics, data)

View File

@ -2319,14 +2319,14 @@ register_diagnostics! {
E0212, // cannot extract an associated type from a higher-ranked trait bound E0212, // cannot extract an associated type from a higher-ranked trait bound
E0213, // associated types are not accepted in this context E0213, // associated types are not accepted in this context
E0214, // parenthesized parameters may only be used with a trait E0214, // parenthesized parameters may only be used with a trait
E0215, // angle-bracket notation is not stable with `Fn` // E0215, // angle-bracket notation is not stable with `Fn`
E0216, // parenthetical notation is only stable with `Fn` // E0216, // parenthetical notation is only stable with `Fn`
E0217, // ambiguous associated type, defined in multiple supertraits E0217, // ambiguous associated type, defined in multiple supertraits
E0218, // no associated type defined E0218, // no associated type defined
E0219, // associated type defined in higher-ranked supertrait E0219, // associated type defined in higher-ranked supertrait
E0221, // ambiguous associated type in bounds E0221, // ambiguous associated type in bounds
//E0222, // Error code E0045 (variadic function must have C calling // E0222, // Error code E0045 (variadic function must have C calling
// convention) duplicate // convention) duplicate
E0224, // at least one non-builtin train is required for an object type E0224, // at least one non-builtin train is required for an object type
E0226, // only a single explicit lifetime bound is permitted E0226, // only a single explicit lifetime bound is permitted
E0227, // ambiguous lifetime bound, explicit lifetime bound required E0227, // ambiguous lifetime bound, explicit lifetime bound required

View File

@ -21,7 +21,7 @@ trait Foo<A> {
fn main() { fn main() {
let x: Box<Foo(isize)>; let x: Box<Foo(isize)>;
//~^ ERROR parenthetical notation is only stable when used with the `Fn` family //~^ ERROR parenthetical notation is only stable when used with `Fn`-family
// No errors with these: // No errors with these:
let x: Box<Fn(isize)>; let x: Box<Fn(isize)>;

View File

@ -12,11 +12,11 @@
// Test that the `Fn` traits require `()` form without a feature gate. // Test that the `Fn` traits require `()` form without a feature gate.
fn bar1(x: &Fn<(), Output=()>) { fn bar1(x: &Fn<(), Output=()>) {
//~^ ERROR angle-bracket notation is not stable when used with the `Fn` family //~^ ERROR of `Fn`-family traits' type parameters is subject to change
} }
fn bar2<T>(x: &T) where T: Fn<()> { fn bar2<T>(x: &T) where T: Fn<()> {
//~^ ERROR angle-bracket notation is not stable when used with the `Fn` family //~^ ERROR of `Fn`-family traits' type parameters is subject to change
} }
fn main() { } fn main() { }