Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tweak output for invalid negative impl AST errors #69722

Merged
merged 7 commits into from
Mar 12, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/librustc_ast/ast.rs
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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,
Centril marked this conversation as resolved.
Show resolved Hide resolved
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],
Centril marked this conversation as resolved.
Show resolved Hide resolved
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");
Centril marked this conversation as resolved.
Show resolved Hide resolved
}
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],
estebank marked this conversation as resolved.
Show resolved Hide resolved
"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],
estebank marked this conversation as resolved.
Show resolved Hide resolved
"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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
};
estebank marked this conversation as resolved.
Show resolved Hide resolved
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_save_analysis/sig.rs
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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 {}
| ------^^^^^^^^^^^^^^^^^^^^^^^^^^^
| ------ ^^^^^
Centril marked this conversation as resolved.
Show resolved Hide resolved
| |
| 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
Original file line number Diff line number Diff line change
@@ -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