allow const function calls in consts that are used in patterns
closes #30117
This commit is contained in:
parent
d75f861518
commit
d23800f3f2
2 changed files with 12 additions and 2 deletions
|
@ -332,6 +332,11 @@ pub fn const_expr_to_pat(tcx: &ty::ctxt, expr: &Expr, span: Span) -> P<hir::Pat>
|
||||||
let path = match def.full_def() {
|
let path = match def.full_def() {
|
||||||
def::DefStruct(def_id) => def_to_path(tcx, def_id),
|
def::DefStruct(def_id) => def_to_path(tcx, def_id),
|
||||||
def::DefVariant(_, variant_did, _) => def_to_path(tcx, variant_did),
|
def::DefVariant(_, variant_did, _) => def_to_path(tcx, variant_did),
|
||||||
|
def::DefFn(..) => return P(hir::Pat {
|
||||||
|
id: expr.id,
|
||||||
|
node: hir::PatLit(P(expr.clone())),
|
||||||
|
span: span,
|
||||||
|
}),
|
||||||
_ => unreachable!()
|
_ => unreachable!()
|
||||||
};
|
};
|
||||||
let pats = args.iter().map(|expr| const_expr_to_pat(tcx, &**expr, span)).collect();
|
let pats = args.iter().map(|expr| const_expr_to_pat(tcx, &**expr, span)).collect();
|
||||||
|
@ -1462,6 +1467,6 @@ fn get_fn_def<'a>(tcx: &'a ty::ctxt,
|
||||||
_ => signal!(e, NonConstPath),
|
_ => signal!(e, NonConstPath),
|
||||||
},
|
},
|
||||||
Some(ast_map::NodeTraitItem(..)) => signal!(e, NonConstPath),
|
Some(ast_map::NodeTraitItem(..)) => signal!(e, NonConstPath),
|
||||||
Some(_) => unimplemented!(),
|
Some(_) => signal!(e, UnimplementedConstVal("calling struct, tuple or variant")),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
|
||||||
// file at the top-level directory of this distribution and at
|
// file at the top-level directory of this distribution and at
|
||||||
// http://rust-lang.org/COPYRIGHT.
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
//
|
//
|
||||||
|
@ -8,15 +8,20 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
|
#![feature(const_fn)]
|
||||||
|
|
||||||
const FOO: isize = 10;
|
const FOO: isize = 10;
|
||||||
const BAR: isize = 3;
|
const BAR: isize = 3;
|
||||||
|
|
||||||
|
const fn foo() -> isize { 4 }
|
||||||
|
const BOO: isize = foo();
|
||||||
|
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
let x: isize = 3;
|
let x: isize = 3;
|
||||||
let y = match x {
|
let y = match x {
|
||||||
FOO => 1,
|
FOO => 1,
|
||||||
BAR => 2,
|
BAR => 2,
|
||||||
|
BOO => 4,
|
||||||
_ => 3
|
_ => 3
|
||||||
};
|
};
|
||||||
assert_eq!(y, 2);
|
assert_eq!(y, 2);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue