Rollup merge of #90022 - hkmatsumoto:self-upper-as-generic-parameter, r=jackh726
Explain why `Self` is invalid in generic parameters Close #89985. r? `@estebank`
This commit is contained in:
commit
29fe57def2
@ -92,6 +92,19 @@ impl<'a> Parser<'a> {
|
|||||||
let attrs = self.parse_outer_attributes()?;
|
let attrs = self.parse_outer_attributes()?;
|
||||||
let param =
|
let param =
|
||||||
self.collect_tokens_trailing_token(attrs, ForceCollect::No, |this, attrs| {
|
self.collect_tokens_trailing_token(attrs, ForceCollect::No, |this, attrs| {
|
||||||
|
if this.eat_keyword_noexpect(kw::SelfUpper) {
|
||||||
|
// `Self` as a generic param is invalid. Here we emit the diagnostic and continue parsing
|
||||||
|
// as if `Self` never existed.
|
||||||
|
this.struct_span_err(
|
||||||
|
this.prev_token.span,
|
||||||
|
"unexpected keyword `Self` in generic parameters",
|
||||||
|
)
|
||||||
|
.note("you cannot use `Self` as a generic parameter because it is reserved for associated items")
|
||||||
|
.emit();
|
||||||
|
|
||||||
|
this.eat(&token::Comma);
|
||||||
|
}
|
||||||
|
|
||||||
let param = if this.check_lifetime() {
|
let param = if this.check_lifetime() {
|
||||||
let lifetime = this.expect_lifetime();
|
let lifetime = this.expect_lifetime();
|
||||||
// Parse lifetime parameter.
|
// Parse lifetime parameter.
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
// Regression test of #36638.
|
// Regression test of #36638.
|
||||||
|
|
||||||
struct Foo<Self>(Self);
|
struct Foo<Self>(Self);
|
||||||
//~^ ERROR expected identifier, found keyword `Self`
|
//~^ ERROR unexpected keyword `Self` in generic parameters
|
||||||
//~^^ ERROR E0392
|
//~| ERROR recursive type `Foo` has infinite size
|
||||||
|
|
||||||
trait Bar<Self> {}
|
trait Bar<Self> {}
|
||||||
//~^ ERROR expected identifier, found keyword `Self`
|
//~^ ERROR unexpected keyword `Self` in generic parameters
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -1,24 +1,33 @@
|
|||||||
error: expected identifier, found keyword `Self`
|
error: unexpected keyword `Self` in generic parameters
|
||||||
--> $DIR/keyword-self-as-type-param.rs:3:12
|
--> $DIR/keyword-self-as-type-param.rs:3:12
|
||||||
|
|
|
|
||||||
LL | struct Foo<Self>(Self);
|
LL | struct Foo<Self>(Self);
|
||||||
| ^^^^ expected identifier, found keyword
|
| ^^^^
|
||||||
|
|
|
||||||
|
= note: you cannot use `Self` as a generic parameter because it is reserved for associated items
|
||||||
|
|
||||||
error: expected identifier, found keyword `Self`
|
error: unexpected keyword `Self` in generic parameters
|
||||||
--> $DIR/keyword-self-as-type-param.rs:7:11
|
--> $DIR/keyword-self-as-type-param.rs:7:11
|
||||||
|
|
|
|
||||||
LL | trait Bar<Self> {}
|
LL | trait Bar<Self> {}
|
||||||
| ^^^^ expected identifier, found keyword
|
| ^^^^
|
||||||
|
|
|
||||||
|
= note: you cannot use `Self` as a generic parameter because it is reserved for associated items
|
||||||
|
|
||||||
error[E0392]: parameter `Self` is never used
|
error[E0072]: recursive type `Foo` has infinite size
|
||||||
--> $DIR/keyword-self-as-type-param.rs:3:12
|
--> $DIR/keyword-self-as-type-param.rs:3:1
|
||||||
|
|
|
|
||||||
LL | struct Foo<Self>(Self);
|
LL | struct Foo<Self>(Self);
|
||||||
| ^^^^ unused parameter
|
| ^^^^^^^^^^^^^^^^^----^^
|
||||||
|
| | |
|
||||||
|
| | recursive without indirection
|
||||||
|
| recursive type has infinite size
|
||||||
|
|
|
|
||||||
= help: consider removing `Self`, referring to it in a field, or using a marker such as `PhantomData`
|
help: insert some indirection (e.g., a `Box`, `Rc`, or `&`) to make `Foo` representable
|
||||||
= help: if you intended `Self` to be a const parameter, use `const Self: usize` instead
|
|
|
||||||
|
LL | struct Foo<Self>(Box<Self>);
|
||||||
|
| ++++ +
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0392`.
|
For more information about this error, try `rustc --explain E0072`.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user