Skip to content

Commit

Permalink
Tweak output for invalid negative impl AST errors
Browse files Browse the repository at this point in the history
  • Loading branch information
estebank committed Mar 5, 2020
1 parent 2b0cfa5 commit 91525fd
Show file tree
Hide file tree
Showing 18 changed files with 56 additions and 52 deletions.
4 changes: 2 additions & 2 deletions src/librustc_ast/ast.rs
Expand Up @@ -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),
}
}
}
Expand Down
28 changes: 18 additions & 10 deletions src/librustc_ast_passes/ast_validation.rs
Expand Up @@ -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: _,
} => {
Expand All @@ -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"
)
Expand All @@ -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(
Expand All @@ -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();
}
Expand Down
8 changes: 4 additions & 4 deletions src/librustc_ast_passes/feature_gate.rs
Expand Up @@ -338,14 +338,14 @@ 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"
use marker types for now"
);
}

Expand Down
2 changes: 1 addition & 1 deletion src/librustc_ast_pretty/pprust.rs
Expand Up @@ -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("!");
}

Expand Down
2 changes: 1 addition & 1 deletion src/librustc_hir/print.rs
Expand Up @@ -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("!");
}

Expand Down
2 changes: 1 addition & 1 deletion src/librustc_parse/parser/item.rs
Expand Up @@ -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
};
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_save_analysis/sig.rs
Expand Up @@ -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)?;
Expand Down
4 changes: 2 additions & 2 deletions src/librustc_typeck/coherence/unsafety.rs
Expand Up @@ -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, _) => {
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_typeck/collect.rs
Expand Up @@ -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");
}
Expand Down
4 changes: 2 additions & 2 deletions src/test/ui/coherence/coherence-negative-impls-safe.stderr
@@ -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

Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/error-codes/E0197.stderr
Expand Up @@ -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

Expand Down
4 changes: 2 additions & 2 deletions src/test/ui/error-codes/E0198.stderr
@@ -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

Expand Down
Expand Up @@ -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
Expand Down
8 changes: 4 additions & 4 deletions src/test/ui/rfc-2632-const-trait-impl/inherent-impl.stderr
@@ -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
|
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/specialization/defaultimpl/validation.stderr
Expand Up @@ -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
|
Expand Down
4 changes: 2 additions & 2 deletions src/test/ui/syntax-trait-polarity-feature-gate.stderr
@@ -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
Expand Down
16 changes: 8 additions & 8 deletions src/test/ui/syntax-trait-polarity.stderr
@@ -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

Expand Down
10 changes: 3 additions & 7 deletions src/test/ui/traits/trait-safety-inherent-impl.stderr
@@ -1,14 +1,10 @@
error[E0197]: inherent impls cannot be unsafe
--> $DIR/trait-safety-inherent-impl.rs:5:1
|
LL | unsafe impl SomeStruct {
| ^-----
| |
| _unsafe because of this
LL | unsafe impl SomeStruct {
| ^^^^^^ ^^^^^^^^^^ inherent impl for this type
| |
LL | | fn foo(self) { }
LL | | }
| |_^
| unsafe because of this

error: aborting due to previous error

Expand Down

0 comments on commit 91525fd

Please sign in to comment.