diff options
| author | bors <bors@rust-lang.org> | 2022-04-30 13:52:29 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-04-30 13:52:29 +0000 |
| commit | d201c812d40932509b2b5307c0b20c1ce78d21da (patch) | |
| tree | febd00751fa6caa1f704cdcabe5249a7643643e7 /compiler/rustc_parse/src | |
| parent | 76d4862fdd131b6f79dc0a31857f888d26bcdb27 (diff) | |
| parent | b4e3e62c9cde00637fc2e69b24581ba77494035b (diff) | |
| download | rust-d201c812d40932509b2b5307c0b20c1ce78d21da.tar.gz rust-d201c812d40932509b2b5307c0b20c1ce78d21da.zip | |
Auto merge of #93803 - cjgillot:unify-bounds, r=oli-obk
Handle generic bounds in a uniform way in HIR Generic bounds in HIR used to be split between bounds in the parameter definition and bounds in a where clause. This PR attempts to store all of those as where predicates. This effectively desugars ```rust fn foo<T: Default, U>(x: impl Copy) where U: Clone ``` into ```rust fn foo<T, U, _V>(x: _V) where T: Default, U: Clone, _V: Copy ``` (where _V is actually hidden and called "impl Copy"). I managed to make compiler warnings more uniform. About rustdoc: is making this desugaring user-visible acceptable? About clippy: I don't understand the subtle logic in the `needless-lifetimes` lint. r? `@estebank`
Diffstat (limited to 'compiler/rustc_parse/src')
| -rw-r--r-- | compiler/rustc_parse/src/parser/generics.rs | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/compiler/rustc_parse/src/parser/generics.rs b/compiler/rustc_parse/src/parser/generics.rs index 29fe2b76101..8081bac7cfd 100644 --- a/compiler/rustc_parse/src/parser/generics.rs +++ b/compiler/rustc_parse/src/parser/generics.rs @@ -30,8 +30,10 @@ impl<'a> Parser<'a> { let ident = self.parse_ident()?; // Parse optional colon and param bounds. + let mut colon_span = None; let bounds = if self.eat(&token::Colon) { - self.parse_generic_bounds(Some(self.prev_token.span))? + colon_span = Some(self.prev_token.span); + self.parse_generic_bounds(colon_span)? } else { Vec::new() }; @@ -45,6 +47,7 @@ impl<'a> Parser<'a> { bounds, kind: GenericParamKind::Type { default }, is_placeholder: false, + colon_span, }) } @@ -69,6 +72,7 @@ impl<'a> Parser<'a> { bounds: Vec::new(), kind: GenericParamKind::Const { ty, kw_span: const_span, default }, is_placeholder: false, + colon_span: None, }) } @@ -97,10 +101,10 @@ impl<'a> Parser<'a> { let param = if this.check_lifetime() { let lifetime = this.expect_lifetime(); // Parse lifetime parameter. - let bounds = if this.eat(&token::Colon) { - this.parse_lt_param_bounds() + let (colon_span, bounds) = if this.eat(&token::Colon) { + (Some(this.prev_token.span), this.parse_lt_param_bounds()) } else { - Vec::new() + (None, Vec::new()) }; Some(ast::GenericParam { ident: lifetime.ident, @@ -109,6 +113,7 @@ impl<'a> Parser<'a> { bounds, kind: ast::GenericParamKind::Lifetime, is_placeholder: false, + colon_span, }) } else if this.check_keyword(kw::Const) { // Parse const parameter. |
