suggest adding { .. }
around a const function with arguments
This commit is contained in:
parent
d53e19540e
commit
529fd2da89
@ -624,9 +624,18 @@ pub(super) fn parse_generic_arg(
|
||||
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);
|
||||
}
|
||||
|
21
src/test/ui/const-generics/const-generic-function.rs
Normal file
21
src/test/ui/const-generics/const-generic-function.rs
Normal 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`
|
||||
}
|
54
src/test/ui/const-generics/const-generic-function.stderr
Normal file
54
src/test/ui/const-generics/const-generic-function.stderr
Normal 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`.
|
Loading…
Reference in New Issue
Block a user