Merge pull request #18619 from ShoyuVanilla/issue-18613

fix: Panic when displaying generic params with defaults
This commit is contained in:
Lukas Wirth 2024-12-05 16:31:33 +00:00 committed by GitHub
commit 0b5f51a264
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 55 additions and 1 deletions

View file

@ -1047,10 +1047,14 @@ impl HirDisplay for Ty {
);
// We print all params except implicit impl Trait params. Still a bit weird; should we leave out parent and self?
if parameters.len() - impl_ > 0 {
let params_len = parameters.len();
// `parameters` are in the order of fn's params (including impl traits), fn's lifetimes
let parameters =
generic_args_sans_defaults(f, Some(generic_def_id), parameters);
let without_impl = self_param as usize + type_ + const_ + lifetime;
assert!(params_len >= parameters.len());
let defaults = params_len - parameters.len();
let without_impl =
self_param as usize + type_ + const_ + lifetime - defaults;
// parent's params (those from enclosing impl or trait, if any).
let (fn_params, parent_params) = parameters.split_at(without_impl + impl_);

View file

@ -9416,3 +9416,53 @@ fn f<T: UnCompat$0>
"#]],
);
}
#[test]
fn issue_18613() {
check(
r#"
fn main() {
struct S<T, D = bool>();
let x$0 = S::<()>;
}"#,
expect![[r#"
*x*
```rust
let x: fn S<()>() -> S<()>
```
---
size = 0, align = 1
"#]],
);
check(
r#"
pub struct Global;
pub struct Box<T, A = Global>(T, A);
impl<T> Box<T> {
pub fn new(x: T) -> Self { loop {} }
}
pub struct String;
fn main() {
let box_value$0 = Box::<String>new();
}
"#,
expect![[r#"
*box_value*
```rust
let box_value: fn Box<String>(String, Global) -> Box<String>
```
---
size = 0, align = 1
"#]],
);
}