allow const generics in const fn
This commit is contained in:
parent
c58c532744
commit
50eb39757e
@ -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";
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user