allow const generics in const fn

This commit is contained in:
Bastian Kauschke 2020-04-13 22:32:40 +02:00
parent c58c532744
commit 50eb39757e
3 changed files with 5 additions and 41 deletions

View File

@ -561,28 +561,6 @@ impl<'a> AstValidator<'a> {
}
}
/// We currently do not permit const generics in `const fn`,
/// as this is tantamount to allowing compile-time dependent typing.
///
/// FIXME(const_generics): Is this really true / necessary? Discuss with @varkor.
/// At any rate, the restriction feels too syntactic. Consider moving it to e.g. typeck.
fn check_const_fn_const_generic(&self, span: Span, sig: &FnSig, generics: &Generics) {
if let Const::Yes(const_span) = sig.header.constness {
// Look for const generics and error if we find any.
for param in &generics.params {
if let GenericParamKind::Const { .. } = param.kind {
self.err_handler()
.struct_span_err(
span,
"const parameters are not permitted in const functions",
)
.span_label(const_span, "`const` because of this")
.emit();
}
}
}
}
fn check_item_named(&self, ident: Ident, kind: &str) {
if ident.name != kw::Underscore {
return;
@ -966,9 +944,8 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
.emit();
}
}
ItemKind::Fn(def, ref sig, ref generics, ref body) => {
ItemKind::Fn(def, _, _, ref body) => {
self.check_defaultness(item.span, def);
self.check_const_fn_const_generic(item.span, sig, generics);
if body.is_none() {
let msg = "free function without a body";

View File

@ -1,11 +1,11 @@
// run-pass
#![feature(const_generics)]
//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash
const fn const_u32_identity<const X: u32>() -> u32 {
//~^ ERROR const parameters are not permitted in const functions
X
}
fn main() {
println!("{:?}", const_u32_identity::<18>());
assert_eq!(const_u32_identity::<18>(), 18);
}

View File

@ -1,23 +1,10 @@
error: const parameters are not permitted in const functions
--> $DIR/const-fn-with-const-param.rs:4:1
|
LL | const fn const_u32_identity<const X: u32>() -> u32 {
| ^----
| |
| _`const` because of this
| |
LL | |
LL | | X
LL | | }
| |_^
warning: the feature `const_generics` is incomplete and may cause the compiler to crash
--> $DIR/const-fn-with-const-param.rs:1:12
--> $DIR/const-fn-with-const-param.rs:2:12
|
LL | #![feature(const_generics)]
| ^^^^^^^^^^^^^^
|
= note: `#[warn(incomplete_features)]` on by default
error: aborting due to previous error; 1 warning emitted
warning: 1 warning emitted