Tweak output for invalid negative impl AST errors
This commit is contained in:
parent
2b0cfa5b4c
commit
91525fd078
@ -2117,14 +2117,14 @@ pub enum ImplPolarity {
|
||||
/// `impl Trait for Type`
|
||||
Positive,
|
||||
/// `impl !Trait for Type`
|
||||
Negative,
|
||||
Negative(Span),
|
||||
}
|
||||
|
||||
impl fmt::Debug for ImplPolarity {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
match *self {
|
||||
ImplPolarity::Positive => "positive".fmt(f),
|
||||
ImplPolarity::Negative => "negative".fmt(f),
|
||||
ImplPolarity::Negative(_) => "negative".fmt(f),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -779,7 +779,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
||||
defaultness: _,
|
||||
constness: _,
|
||||
generics: _,
|
||||
of_trait: Some(_),
|
||||
of_trait: Some(ref t),
|
||||
ref self_ty,
|
||||
items: _,
|
||||
} => {
|
||||
@ -794,10 +794,10 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
||||
.help("use `auto trait Trait {}` instead")
|
||||
.emit();
|
||||
}
|
||||
if let (Unsafe::Yes(span), ImplPolarity::Negative) = (unsafety, polarity) {
|
||||
if let (Unsafe::Yes(span), ImplPolarity::Negative(sp)) = (unsafety, polarity) {
|
||||
struct_span_err!(
|
||||
this.session,
|
||||
item.span,
|
||||
sp.to(t.path.span),
|
||||
E0198,
|
||||
"negative impls cannot be unsafe"
|
||||
)
|
||||
@ -816,7 +816,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
||||
constness,
|
||||
generics: _,
|
||||
of_trait: None,
|
||||
self_ty: _,
|
||||
ref self_ty,
|
||||
items: _,
|
||||
} => {
|
||||
self.invalid_visibility(
|
||||
@ -826,28 +826,36 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
||||
if let Unsafe::Yes(span) = unsafety {
|
||||
struct_span_err!(
|
||||
self.session,
|
||||
item.span,
|
||||
vec![span, self_ty.span],
|
||||
E0197,
|
||||
"inherent impls cannot be unsafe"
|
||||
)
|
||||
.span_label(span, "unsafe because of this")
|
||||
.span_label(self_ty.span, "inherent impl for this type")
|
||||
.emit();
|
||||
}
|
||||
if polarity == ImplPolarity::Negative {
|
||||
self.err_handler().span_err(item.span, "inherent impls cannot be negative");
|
||||
if let ImplPolarity::Negative(span) = polarity {
|
||||
self.err_handler().span_err(span, "inherent impls cannot be negative");
|
||||
}
|
||||
if let Defaultness::Default(def_span) = defaultness {
|
||||
let span = self.session.source_map().def_span(item.span);
|
||||
self.err_handler()
|
||||
.struct_span_err(span, "inherent impls cannot be `default`")
|
||||
.struct_span_err(
|
||||
vec![def_span, self_ty.span],
|
||||
"inherent impls cannot be `default`",
|
||||
)
|
||||
.span_label(def_span, "`default` because of this")
|
||||
.span_label(self_ty.span, "inherent impl for this type")
|
||||
.note("only trait implementations may be annotated with `default`")
|
||||
.emit();
|
||||
}
|
||||
if let Const::Yes(span) = constness {
|
||||
self.err_handler()
|
||||
.struct_span_err(item.span, "inherent impls cannot be `const`")
|
||||
.struct_span_err(
|
||||
vec![span, self_ty.span],
|
||||
"inherent impls cannot be `const`",
|
||||
)
|
||||
.span_label(span, "`const` because of this")
|
||||
.span_label(self_ty.span, "inherent impl for this type")
|
||||
.note("only trait implementations may be annotated with `const`")
|
||||
.emit();
|
||||
}
|
||||
|
@ -338,12 +338,12 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
ast::ItemKind::Impl { polarity, defaultness, .. } => {
|
||||
if polarity == ast::ImplPolarity::Negative {
|
||||
ast::ItemKind::Impl { polarity, defaultness, ref of_trait, .. } => {
|
||||
if let ast::ImplPolarity::Negative(span) = polarity {
|
||||
gate_feature_post!(
|
||||
&self,
|
||||
optin_builtin_traits,
|
||||
i.span,
|
||||
span.to(of_trait.as_ref().map(|t| t.path.span).unwrap_or(span)),
|
||||
"negative trait bounds are not yet fully implemented; \
|
||||
use marker types for now"
|
||||
);
|
||||
|
@ -1175,7 +1175,7 @@ impl<'a> State<'a> {
|
||||
self.s.space();
|
||||
}
|
||||
|
||||
if polarity == ast::ImplPolarity::Negative {
|
||||
if let ast::ImplPolarity::Negative(_) = polarity {
|
||||
self.s.word("!");
|
||||
}
|
||||
|
||||
|
@ -652,7 +652,7 @@ impl<'a> State<'a> {
|
||||
self.word_nbsp("const");
|
||||
}
|
||||
|
||||
if let hir::ImplPolarity::Negative = polarity {
|
||||
if let hir::ImplPolarity::Negative(_) = polarity {
|
||||
self.s.word("!");
|
||||
}
|
||||
|
||||
|
@ -414,7 +414,7 @@ impl<'a> Parser<'a> {
|
||||
// Disambiguate `impl !Trait for Type { ... }` and `impl ! { ... }` for the never type.
|
||||
let polarity = if self.check(&token::Not) && self.look_ahead(1, |t| t.can_begin_type()) {
|
||||
self.bump(); // `!`
|
||||
ast::ImplPolarity::Negative
|
||||
ast::ImplPolarity::Negative(self.prev_token.span)
|
||||
} else {
|
||||
ast::ImplPolarity::Positive
|
||||
};
|
||||
|
@ -519,7 +519,7 @@ impl Sig for ast::Item {
|
||||
text.push(' ');
|
||||
|
||||
let trait_sig = if let Some(ref t) = *of_trait {
|
||||
if polarity == ast::ImplPolarity::Negative {
|
||||
if let ast::ImplPolarity::Negative(_) = polarity {
|
||||
text.push('!');
|
||||
}
|
||||
let trait_sig = t.path.make(offset + text.len(), id, scx)?;
|
||||
|
@ -69,11 +69,11 @@ impl UnsafetyChecker<'tcx> {
|
||||
.emit();
|
||||
}
|
||||
|
||||
(_, _, Unsafety::Unsafe, hir::ImplPolarity::Negative) => {
|
||||
(_, _, Unsafety::Unsafe, hir::ImplPolarity::Negative(_)) => {
|
||||
// Reported in AST validation
|
||||
self.tcx.sess.delay_span_bug(item.span, "unsafe negative impl");
|
||||
}
|
||||
(_, _, Unsafety::Normal, hir::ImplPolarity::Negative)
|
||||
(_, _, Unsafety::Normal, hir::ImplPolarity::Negative(_))
|
||||
| (Unsafety::Unsafe, _, Unsafety::Unsafe, hir::ImplPolarity::Positive)
|
||||
| (Unsafety::Normal, Some(_), Unsafety::Unsafe, hir::ImplPolarity::Positive)
|
||||
| (Unsafety::Normal, None, Unsafety::Normal, _) => {
|
||||
|
@ -1548,7 +1548,7 @@ fn impl_polarity(tcx: TyCtxt<'_>, def_id: DefId) -> ty::ImplPolarity {
|
||||
let is_rustc_reservation = tcx.has_attr(def_id, sym::rustc_reservation_impl);
|
||||
let item = tcx.hir().expect_item(hir_id);
|
||||
match &item.kind {
|
||||
hir::ItemKind::Impl { polarity: hir::ImplPolarity::Negative, .. } => {
|
||||
hir::ItemKind::Impl { polarity: hir::ImplPolarity::Negative(_), .. } => {
|
||||
if is_rustc_reservation {
|
||||
tcx.sess.span_err(item.span, "reservation impls can't be negative");
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
error[E0198]: negative impls cannot be unsafe
|
||||
--> $DIR/coherence-negative-impls-safe.rs:7:1
|
||||
--> $DIR/coherence-negative-impls-safe.rs:7:13
|
||||
|
|
||||
LL | unsafe impl !Send for TestType {}
|
||||
| ------^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ------ ^^^^^
|
||||
| |
|
||||
| unsafe because of this
|
||||
|
||||
|
@ -2,7 +2,7 @@ error[E0197]: inherent impls cannot be unsafe
|
||||
--> $DIR/E0197.rs:3:1
|
||||
|
|
||||
LL | unsafe impl Foo { }
|
||||
| ------^^^^^^^^^^^^^
|
||||
| ^^^^^^ ^^^ inherent impl for this type
|
||||
| |
|
||||
| unsafe because of this
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
error[E0198]: negative impls cannot be unsafe
|
||||
--> $DIR/E0198.rs:5:1
|
||||
--> $DIR/E0198.rs:5:13
|
||||
|
|
||||
LL | unsafe impl !Send for Foo { }
|
||||
| ------^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ------ ^^^^^
|
||||
| |
|
||||
| unsafe because of this
|
||||
|
||||
|
@ -8,10 +8,10 @@ LL | auto trait AutoDummyTrait {}
|
||||
= help: add `#![feature(optin_builtin_traits)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: negative trait bounds are not yet fully implemented; use marker types for now
|
||||
--> $DIR/feature-gate-optin-builtin-traits.rs:9:1
|
||||
--> $DIR/feature-gate-optin-builtin-traits.rs:9:6
|
||||
|
|
||||
LL | impl !AutoDummyTrait for DummyStruct {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: see issue #13231 <https://github.com/rust-lang/rust/issues/13231> for more information
|
||||
= help: add `#![feature(optin_builtin_traits)]` to the crate attributes to enable
|
||||
|
@ -1,18 +1,18 @@
|
||||
error: inherent impls cannot be `const`
|
||||
--> $DIR/inherent-impl.rs:9:1
|
||||
--> $DIR/inherent-impl.rs:9:6
|
||||
|
|
||||
LL | impl const S {}
|
||||
| ^^^^^-----^^^^^
|
||||
| ^^^^^ ^ inherent impl for this type
|
||||
| |
|
||||
| `const` because of this
|
||||
|
|
||||
= note: only trait implementations may be annotated with `const`
|
||||
|
||||
error: inherent impls cannot be `const`
|
||||
--> $DIR/inherent-impl.rs:12:1
|
||||
--> $DIR/inherent-impl.rs:12:6
|
||||
|
|
||||
LL | impl const T {}
|
||||
| ^^^^^-----^^^^^
|
||||
| ^^^^^ ^ inherent impl for this type
|
||||
| |
|
||||
| `const` because of this
|
||||
|
|
||||
|
@ -2,7 +2,7 @@ error: inherent impls cannot be `default`
|
||||
--> $DIR/validation.rs:7:1
|
||||
|
|
||||
LL | default impl S {}
|
||||
| -------^^^^^^^
|
||||
| ^^^^^^^ ^ inherent impl for this type
|
||||
| |
|
||||
| `default` because of this
|
||||
|
|
||||
|
@ -1,8 +1,8 @@
|
||||
error[E0658]: negative trait bounds are not yet fully implemented; use marker types for now
|
||||
--> $DIR/syntax-trait-polarity-feature-gate.rs:7:1
|
||||
--> $DIR/syntax-trait-polarity-feature-gate.rs:7:6
|
||||
|
|
||||
LL | impl !Send for TestType {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^^^^^
|
||||
|
|
||||
= note: see issue #13231 <https://github.com/rust-lang/rust/issues/13231> for more information
|
||||
= help: add `#![feature(optin_builtin_traits)]` to the crate attributes to enable
|
||||
|
@ -1,28 +1,28 @@
|
||||
error: inherent impls cannot be negative
|
||||
--> $DIR/syntax-trait-polarity.rs:7:1
|
||||
--> $DIR/syntax-trait-polarity.rs:7:6
|
||||
|
|
||||
LL | impl !TestType {}
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
| ^
|
||||
|
||||
error[E0198]: negative impls cannot be unsafe
|
||||
--> $DIR/syntax-trait-polarity.rs:12:1
|
||||
--> $DIR/syntax-trait-polarity.rs:12:13
|
||||
|
|
||||
LL | unsafe impl !Send for TestType {}
|
||||
| ------^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ------ ^^^^^
|
||||
| |
|
||||
| unsafe because of this
|
||||
|
||||
error: inherent impls cannot be negative
|
||||
--> $DIR/syntax-trait-polarity.rs:19:1
|
||||
--> $DIR/syntax-trait-polarity.rs:19:9
|
||||
|
|
||||
LL | impl<T> !TestType2<T> {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^
|
||||
|
||||
error[E0198]: negative impls cannot be unsafe
|
||||
--> $DIR/syntax-trait-polarity.rs:22:1
|
||||
--> $DIR/syntax-trait-polarity.rs:22:16
|
||||
|
|
||||
LL | unsafe impl<T> !Send for TestType2<T> {}
|
||||
| ------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ------ ^^^^^
|
||||
| |
|
||||
| unsafe because of this
|
||||
|
||||
|
@ -2,13 +2,9 @@ error[E0197]: inherent impls cannot be unsafe
|
||||
--> $DIR/trait-safety-inherent-impl.rs:5:1
|
||||
|
|
||||
LL | unsafe impl SomeStruct {
|
||||
| ^-----
|
||||
| ^^^^^^ ^^^^^^^^^^ inherent impl for this type
|
||||
| |
|
||||
| _unsafe because of this
|
||||
| |
|
||||
LL | | fn foo(self) { }
|
||||
LL | | }
|
||||
| |_^
|
||||
| unsafe because of this
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user