allow const generics in const fn
This commit is contained in:
parent
c58c532744
commit
50eb39757e
3 changed files with 5 additions and 41 deletions
|
@ -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) {
|
fn check_item_named(&self, ident: Ident, kind: &str) {
|
||||||
if ident.name != kw::Underscore {
|
if ident.name != kw::Underscore {
|
||||||
return;
|
return;
|
||||||
|
@ -966,9 +944,8 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
||||||
.emit();
|
.emit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ItemKind::Fn(def, ref sig, ref generics, ref body) => {
|
ItemKind::Fn(def, _, _, ref body) => {
|
||||||
self.check_defaultness(item.span, def);
|
self.check_defaultness(item.span, def);
|
||||||
self.check_const_fn_const_generic(item.span, sig, generics);
|
|
||||||
|
|
||||||
if body.is_none() {
|
if body.is_none() {
|
||||||
let msg = "free function without a body";
|
let msg = "free function without a body";
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
|
// run-pass
|
||||||
#![feature(const_generics)]
|
#![feature(const_generics)]
|
||||||
//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash
|
//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash
|
||||||
|
|
||||||
const fn const_u32_identity<const X: u32>() -> u32 {
|
const fn const_u32_identity<const X: u32>() -> u32 {
|
||||||
//~^ ERROR const parameters are not permitted in const functions
|
|
||||||
X
|
X
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
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
|
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)]
|
LL | #![feature(const_generics)]
|
||||||
| ^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
||||||
error: aborting due to previous error; 1 warning emitted
|
warning: 1 warning emitted
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue