提交 50eb3975 编写于 作者: B Bastian Kauschke

allow const generics in const fn

上级 c58c5327
......@@ -561,28 +561,6 @@ fn check_c_varadic_type(&self, fk: FnKind<'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 @@ fn visit_item(&mut self, item: &'a Item) {
.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";
......
// 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);
}
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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册