suggest adding { .. } around a const function with arguments

This commit is contained in:
Takayuki Maeda 2022-03-08 17:07:35 +09:00
parent d53e19540e
commit 529fd2da89
3 changed files with 84 additions and 0 deletions

View File

@ -624,9 +624,18 @@ impl<'a> Parser<'a> {
GenericArg::Const(self.parse_const_arg()?)
} else if self.check_type() {
// Parse type argument.
let is_const_fn = self.look_ahead(1, |t| t.kind == token::OpenDelim(token::Paren));
let mut snapshot = self.clone();
match self.parse_ty() {
Ok(ty) => GenericArg::Type(ty),
Err(err) => {
if is_const_fn {
if let Ok(expr) = snapshot.parse_expr_res(Restrictions::CONST_EXPR, None) {
*self = snapshot;
return Ok(Some(self.dummy_const_arg_needs_braces(err, expr.span)));
}
}
// self.parse_fn_call_expr();
// Try to recover from possible `const` arg without braces.
return self.recover_const_arg(start, err).map(Some);
}

View File

@ -0,0 +1,21 @@
fn foo<const N: i32>() -> i32 {
N
}
const fn bar(n: i32, m: i32) -> i32 {
n
}
const fn baz() -> i32 {
1
}
const FOO: i32 = 3;
fn main() {
foo::<baz()>(); //~ ERROR expected type, found function `baz`
//~| ERROR unresolved item provided when a constant was expected
foo::<bar(bar(1, 1), bar(1, 1))>(); //~ ERROR expected type, found `1`
foo::<bar(1, 1)>(); //~ ERROR expected type, found `1`
foo::<bar(FOO, 2)>(); //~ ERROR expected type, found `2`
}

View File

@ -0,0 +1,54 @@
error: expected type, found `1`
--> $DIR/const-generic-function.rs:18:19
|
LL | foo::<bar(bar(1, 1), bar(1, 1))>();
| ^ expected type
|
help: expressions must be enclosed in braces to be used as const generic arguments
|
LL | foo::<{ bar(bar(1, 1), bar(1, 1)) }>();
| + +
error: expected type, found `1`
--> $DIR/const-generic-function.rs:19:15
|
LL | foo::<bar(1, 1)>();
| ^ expected type
|
help: expressions must be enclosed in braces to be used as const generic arguments
|
LL | foo::<{ bar(1, 1) }>();
| + +
error: expected type, found `2`
--> $DIR/const-generic-function.rs:20:20
|
LL | foo::<bar(FOO, 2)>();
| ^ expected type
|
help: expressions must be enclosed in braces to be used as const generic arguments
|
LL | foo::<{ bar(FOO, 2) }>();
| + +
error[E0573]: expected type, found function `baz`
--> $DIR/const-generic-function.rs:16:11
|
LL | foo::<baz()>();
| ^^^^^ not a type
error[E0747]: unresolved item provided when a constant was expected
--> $DIR/const-generic-function.rs:16:11
|
LL | foo::<baz()>();
| ^^^^^
|
help: if this generic argument was intended as a const parameter, surround it with braces
|
LL | foo::<{ baz() }>();
| + +
error: aborting due to 5 previous errors
Some errors have detailed explanations: E0573, E0747.
For more information about an error, try `rustc --explain E0573`.