Skip to content

Commit

Permalink
Rollup merge of #70249 - lcnr:issue70125, r=eddyb
Browse files Browse the repository at this point in the history
handle ConstKind::Unresolved after monomorphizing

fixes #70125

r? @bjorn3
  • Loading branch information
Centril authored Mar 23, 2020
2 parents 8dda617 + 8533778 commit 092c821
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 24 deletions.
43 changes: 19 additions & 24 deletions src/librustc_codegen_ssa/mir/constant.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,31 +40,26 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
&mut self,
constant: &mir::Constant<'tcx>,
) -> Result<ConstValue<'tcx>, ErrorHandled> {
match constant.literal.val {
ty::ConstKind::Unevaluated(def_id, substs, promoted) => {
let substs = self.monomorphize(&substs);
self.cx
.tcx()
.const_eval_resolve(ty::ParamEnv::reveal_all(), def_id, substs, promoted, None)
.map_err(|err| {
if promoted.is_none() {
self.cx
.tcx()
.sess
.span_err(constant.span, "erroneous constant encountered");
}
err
})
}
match self.monomorphize(&constant.literal).val {
ty::ConstKind::Unevaluated(def_id, substs, promoted) => self
.cx
.tcx()
.const_eval_resolve(ty::ParamEnv::reveal_all(), def_id, substs, promoted, None)
.map_err(|err| {
if promoted.is_none() {
self.cx
.tcx()
.sess
.span_err(constant.span, "erroneous constant encountered");
}
err
}),
ty::ConstKind::Value(value) => Ok(value),
_ => {
let const_ = self.monomorphize(&constant.literal);
if let ty::ConstKind::Value(value) = const_.val {
Ok(value)
} else {
span_bug!(constant.span, "encountered bad ConstKind in codegen: {:?}", const_);
}
}
err => span_bug!(
constant.span,
"encountered bad ConstKind after monomorphizing: {:?}",
err
),
}
}

Expand Down
19 changes: 19 additions & 0 deletions src/test/ui/const-generics/issues/issue-70125-1.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// run-pass
#![feature(const_generics)]
//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash

const L: usize = 4;

pub trait Print<const N: usize> {
fn print(&self) -> usize {
N
}
}

pub struct Printer;
impl Print<L> for Printer {}

fn main() {
let p = Printer;
assert_eq!(p.print(), 4);
}
8 changes: 8 additions & 0 deletions src/test/ui/const-generics/issues/issue-70125-1.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
warning: the feature `const_generics` is incomplete and may cause the compiler to crash
--> $DIR/issue-70125-1.rs:2:12
|
LL | #![feature(const_generics)]
| ^^^^^^^^^^^^^^
|
= note: `#[warn(incomplete_features)]` on by default

16 changes: 16 additions & 0 deletions src/test/ui/const-generics/issues/issue-70125-2.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// run-pass

#![feature(const_generics)]
//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash

fn main() {
<()>::foo();
}

trait Foo<const X: usize> {
fn foo() -> usize {
X
}
}

impl Foo<{3}> for () {}
8 changes: 8 additions & 0 deletions src/test/ui/const-generics/issues/issue-70125-2.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
warning: the feature `const_generics` is incomplete and may cause the compiler to crash
--> $DIR/issue-70125-2.rs:3:12
|
LL | #![feature(const_generics)]
| ^^^^^^^^^^^^^^
|
= note: `#[warn(incomplete_features)]` on by default

0 comments on commit 092c821

Please sign in to comment.