Skip to content

Commit

Permalink
Rollup merge of #71109 - lcnr:generics_in_const_fn, r=eddyb
Browse files Browse the repository at this point in the history
allow const generics in const fn

This was explicitly forbidden before. As we were unable to think of a reason
why this should still be the case, this check has been removed.

r? @eddyb
cc @varkor @Centril
  • Loading branch information
Dylan-DPC authored Apr 13, 2020
2 parents e261ef0 + 50eb397 commit dd27462
Show file tree
Hide file tree
Showing 3 changed files with 5 additions and 41 deletions.
25 changes: 1 addition & 24 deletions src/librustc_ast_passes/ast_validation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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";
Expand Down
4 changes: 2 additions & 2 deletions src/test/ui/const-generics/const-fn-with-const-param.rs
Original file line number Diff line number Diff line change
@@ -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);
}
17 changes: 2 additions & 15 deletions src/test/ui/const-generics/const-fn-with-const-param.stderr
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit dd27462

Please sign in to comment.