Rollup merge of #137831 - estebank:auto-trait-err, r=compiler-errors
Tweak auto trait errors
Make suggestions to remove params and super traits verbose and make spans more accurate.
```
error[E0567]: auto traits cannot have generic parameters
--> $DIR/auto-trait-validation.rs:6:19
|
LL | auto trait Generic<T> {}
| -------^^^
| |
| auto trait cannot have generic parameters
error[E0568]: auto traits cannot have super traits or lifetime bounds
--> $DIR/auto-trait-validation.rs:8:20
|
LL | auto trait Bound : Copy {}
| ----- ^^^^
| |
| auto traits cannot have super traits or lifetime bounds
```
```
error[E0380]: auto traits cannot have associated items
--> $DIR/issue-23080.rs:5:8
|
LL | unsafe auto trait Trait {
| ----- auto traits cannot have associated items
LL | fn method(&self) {
| ^^^^^^
```
This commit is contained in:
@@ -40,7 +40,7 @@ ast_passes_auto_generic = auto traits cannot have generic parameters
|
||||
|
||||
ast_passes_auto_items = auto traits cannot have associated items
|
||||
.label = {ast_passes_auto_items}
|
||||
.suggestion = remove these associated items
|
||||
.suggestion = remove the associated items
|
||||
|
||||
ast_passes_auto_super_lifetime = auto traits cannot have super traits or lifetime bounds
|
||||
.label = {ast_passes_auto_super_lifetime}
|
||||
|
||||
@@ -699,19 +699,23 @@ impl<'a> AstValidator<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
fn deny_super_traits(&self, bounds: &GenericBounds, ident_span: Span) {
|
||||
fn deny_super_traits(&self, bounds: &GenericBounds, ident: Span) {
|
||||
if let [.., last] = &bounds[..] {
|
||||
let span = ident_span.shrink_to_hi().to(last.span());
|
||||
self.dcx().emit_err(errors::AutoTraitBounds { span, ident: ident_span });
|
||||
let span = bounds.iter().map(|b| b.span()).collect();
|
||||
let removal = ident.shrink_to_hi().to(last.span());
|
||||
self.dcx().emit_err(errors::AutoTraitBounds { span, removal, ident });
|
||||
}
|
||||
}
|
||||
|
||||
fn deny_where_clause(&self, where_clause: &WhereClause, ident_span: Span) {
|
||||
fn deny_where_clause(&self, where_clause: &WhereClause, ident: Span) {
|
||||
if !where_clause.predicates.is_empty() {
|
||||
// FIXME: The current diagnostic is misleading since it only talks about
|
||||
// super trait and lifetime bounds while we should just say “bounds”.
|
||||
self.dcx()
|
||||
.emit_err(errors::AutoTraitBounds { span: where_clause.span, ident: ident_span });
|
||||
self.dcx().emit_err(errors::AutoTraitBounds {
|
||||
span: vec![where_clause.span],
|
||||
removal: where_clause.span,
|
||||
ident,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -344,7 +344,7 @@ pub(crate) struct ModuleNonAscii {
|
||||
#[diag(ast_passes_auto_generic, code = E0567)]
|
||||
pub(crate) struct AutoTraitGeneric {
|
||||
#[primary_span]
|
||||
#[suggestion(code = "", applicability = "machine-applicable")]
|
||||
#[suggestion(code = "", applicability = "machine-applicable", style = "tool-only")]
|
||||
pub span: Span,
|
||||
#[label]
|
||||
pub ident: Span,
|
||||
@@ -354,8 +354,9 @@ pub(crate) struct AutoTraitGeneric {
|
||||
#[diag(ast_passes_auto_super_lifetime, code = E0568)]
|
||||
pub(crate) struct AutoTraitBounds {
|
||||
#[primary_span]
|
||||
#[suggestion(code = "", applicability = "machine-applicable")]
|
||||
pub span: Span,
|
||||
pub span: Vec<Span>,
|
||||
#[suggestion(code = "", applicability = "machine-applicable", style = "tool-only")]
|
||||
pub removal: Span,
|
||||
#[label]
|
||||
pub ident: Span,
|
||||
}
|
||||
@@ -365,7 +366,7 @@ pub(crate) struct AutoTraitBounds {
|
||||
pub(crate) struct AutoTraitItems {
|
||||
#[primary_span]
|
||||
pub spans: Vec<Span>,
|
||||
#[suggestion(code = "", applicability = "machine-applicable")]
|
||||
#[suggestion(code = "", applicability = "machine-applicable", style = "tool-only")]
|
||||
pub total: Span,
|
||||
#[label]
|
||||
pub ident: Span,
|
||||
|
||||
Reference in New Issue
Block a user