diff --git a/src/librustc/middle/const_eval.rs b/src/librustc/middle/const_eval.rs index 9f75f9ebb9adf..f0cfd900fd75a 100644 --- a/src/librustc/middle/const_eval.rs +++ b/src/librustc/middle/const_eval.rs @@ -332,6 +332,11 @@ pub fn const_expr_to_pat(tcx: &ty::ctxt, expr: &Expr, span: Span) -> P let path = match def.full_def() { def::DefStruct(def_id) => def_to_path(tcx, def_id), 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!() }; let pats = args.iter().map(|expr| const_expr_to_pat(tcx, &**expr, span)).collect(); @@ -1440,6 +1445,6 @@ fn get_fn_def<'a>(tcx: &'a ty::ctxt, _ => signal!(e, NonConstPath), }, Some(ast_map::NodeTraitItem(..)) => signal!(e, NonConstPath), - Some(_) => unimplemented!(), + Some(_) => signal!(e, UnimplementedConstVal("calling struct, tuple or variant")), } } diff --git a/src/test/compile-fail/const-pattern-not-const-evaluable.rs b/src/test/compile-fail/const-pattern-not-const-evaluable.rs new file mode 100644 index 0000000000000..ecc43d21a4612 --- /dev/null +++ b/src/test/compile-fail/const-pattern-not-const-evaluable.rs @@ -0,0 +1,39 @@ +// Copyright 2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(const_fn)] + +enum Cake { + BlackForest, + Marmor, +} +use Cake::*; + +const BOO: (Cake, Cake) = (Marmor, BlackForest); +//~^ ERROR: constant evaluation error: non-constant path in constant expression [E0471] +const FOO: Cake = BOO.1; + +const fn foo() -> Cake { + Marmor //~ ERROR: constant evaluation error: non-constant path in constant expression [E0471] + //~^ ERROR: non-constant path in constant expression +} + +const WORKS: Cake = Marmor; + +const GOO: Cake = foo(); + +fn main() { + match BlackForest { + FOO => println!("hi"), //~ NOTE: in pattern here + GOO => println!("meh"), //~ NOTE: in pattern here + WORKS => println!("möp"), + _ => println!("bye"), + } +} diff --git a/src/test/run-pass/consts-in-patterns.rs b/src/test/run-pass/consts-in-patterns.rs index 36e6e160a3bd2..eec4c940585c0 100644 --- a/src/test/run-pass/consts-in-patterns.rs +++ b/src/test/run-pass/consts-in-patterns.rs @@ -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 // http://rust-lang.org/COPYRIGHT. // @@ -8,15 +8,20 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +#![feature(const_fn)] const FOO: isize = 10; const BAR: isize = 3; +const fn foo() -> isize { 4 } +const BOO: isize = foo(); + pub fn main() { let x: isize = 3; let y = match x { FOO => 1, BAR => 2, + BOO => 4, _ => 3 }; assert_eq!(y, 2); diff --git a/src/test/run-pass/issue29927-1.rs b/src/test/run-pass/issue29927-1.rs new file mode 100644 index 0000000000000..68271accb61a2 --- /dev/null +++ b/src/test/run-pass/issue29927-1.rs @@ -0,0 +1,20 @@ +// Copyright 2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(const_fn)] +const fn f() -> usize { + 5 +} +struct A { + field: usize, +} +fn main() { + let _ = [0; f()]; +} diff --git a/src/test/run-pass/issue29927.rs b/src/test/run-pass/issue29927.rs new file mode 100644 index 0000000000000..6d9adbcd57980 --- /dev/null +++ b/src/test/run-pass/issue29927.rs @@ -0,0 +1,20 @@ +// Copyright 2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(const_fn)] +struct A { + field: usize, +} +const fn f() -> usize { + 5 +} +fn main() { + let _ = [0; f()]; +}