Skip to content

Commit

Permalink
Rollup merge of #89147 - b-naber:refs_in_check_const_value_eq, r=oli-obk
Browse files Browse the repository at this point in the history
add case for checking const refs in check_const_value_eq

Previously in `check_const_value_eq` we destructured `ConstValue::ByRef` instances, this didn't account for `ty::Ref`s however, which led to an ICE.

Fixes #88876
Fixes #88384

r? `@oli-obk`
  • Loading branch information
the8472 authored Sep 21, 2021
2 parents aca790b + 999888c commit a3e6c19
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 0 deletions.
9 changes: 9 additions & 0 deletions compiler/rustc_middle/src/ty/relate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -639,6 +639,15 @@ fn check_const_value_eq<R: TypeRelation<'tcx>>(
get_slice_bytes(&tcx, a_val) == get_slice_bytes(&tcx, b_val)
}

(ConstValue::ByRef { alloc: alloc_a, .. }, ConstValue::ByRef { alloc: alloc_b, .. })
if a.ty.is_ref() || b.ty.is_ref() =>
{
if a.ty.is_ref() && b.ty.is_ref() {
alloc_a == alloc_b
} else {
false
}
}
(ConstValue::ByRef { .. }, ConstValue::ByRef { .. }) => {
let a_destructured = tcx.destructure_const(relation.param_env().and(a));
let b_destructured = tcx.destructure_const(relation.param_env().and(b));
Expand Down
25 changes: 25 additions & 0 deletions src/test/ui/consts/refs_check_const_eq-issue-88384.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// check-pass

#![feature(fn_traits)]
#![feature(adt_const_params)]
//~^ WARNING the feature `adt_const_params` is incomplete

#[derive(PartialEq, Eq)]
struct CompileTimeSettings{
hooks: &'static[fn()],
}

struct Foo<const T: CompileTimeSettings>;

impl<const T: CompileTimeSettings> Foo<T> {
fn call_hooks(){
}
}

fn main(){
const SETTINGS: CompileTimeSettings = CompileTimeSettings{
hooks: &[],
};

Foo::<SETTINGS>::call_hooks();
}
11 changes: 11 additions & 0 deletions src/test/ui/consts/refs_check_const_eq-issue-88384.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
warning: the feature `adt_const_params` is incomplete and may not be safe to use and/or cause compiler crashes
--> $DIR/refs_check_const_eq-issue-88384.rs:4:12
|
LL | #![feature(adt_const_params)]
| ^^^^^^^^^^^^^^^^
|
= note: `#[warn(incomplete_features)]` on by default
= note: see issue #44580 <https://github.com/rust-lang/rust/issues/44580> for more information

warning: 1 warning emitted

12 changes: 12 additions & 0 deletions src/test/ui/consts/refs_check_const_value_eq-issue-88876.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// check-pass

#![allow(incomplete_features)]
#![feature(adt_const_params)]

struct FooConst<const ARRAY: &'static [&'static str]> {}

const FOO_ARR: &[&'static str; 2] = &["Hello", "Friend"];

fn main() {
let _ = FooConst::<FOO_ARR> {};
}

0 comments on commit a3e6c19

Please sign in to comment.