suggest adding { .. }
around a const function with arguments
This commit is contained in:
parent
d53e19540e
commit
529fd2da89
3 changed files with 84 additions and 0 deletions
|
@ -624,9 +624,18 @@ impl<'a> Parser<'a> {
|
||||||
GenericArg::Const(self.parse_const_arg()?)
|
GenericArg::Const(self.parse_const_arg()?)
|
||||||
} else if self.check_type() {
|
} else if self.check_type() {
|
||||||
// Parse type argument.
|
// 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() {
|
match self.parse_ty() {
|
||||||
Ok(ty) => GenericArg::Type(ty),
|
Ok(ty) => GenericArg::Type(ty),
|
||||||
Err(err) => {
|
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.
|
// Try to recover from possible `const` arg without braces.
|
||||||
return self.recover_const_arg(start, err).map(Some);
|
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…
Add table
Add a link
Reference in a new issue