patterns: don't ice when encountering a raw str slice
This commit is contained in:
parent
1db4b12494
commit
f6a49ba416
@ -11,7 +11,7 @@ use rustc_middle::mir;
|
|||||||
use rustc_middle::ty::layout::{LayoutCx, LayoutOf, TyAndLayout};
|
use rustc_middle::ty::layout::{LayoutCx, LayoutOf, TyAndLayout};
|
||||||
use rustc_middle::ty::{self, ScalarInt, Ty, TyCtxt};
|
use rustc_middle::ty::{self, ScalarInt, Ty, TyCtxt};
|
||||||
use rustc_span::DUMMY_SP;
|
use rustc_span::DUMMY_SP;
|
||||||
use rustc_target::abi::VariantIdx;
|
use rustc_target::abi::{Abi, VariantIdx};
|
||||||
|
|
||||||
#[instrument(skip(ecx), level = "debug")]
|
#[instrument(skip(ecx), level = "debug")]
|
||||||
fn branches<'tcx>(
|
fn branches<'tcx>(
|
||||||
@ -101,11 +101,16 @@ pub(crate) fn const_to_valtree_inner<'tcx>(
|
|||||||
// Not all raw pointers are allowed, as we cannot properly test them for
|
// Not all raw pointers are allowed, as we cannot properly test them for
|
||||||
// equality at compile-time (see `ptr_guaranteed_cmp`).
|
// equality at compile-time (see `ptr_guaranteed_cmp`).
|
||||||
// However we allow those that are just integers in disguise.
|
// However we allow those that are just integers in disguise.
|
||||||
// (We could allow wide raw pointers where both sides are integers in the future,
|
// First, get the pointer. Remember it might be wide!
|
||||||
// but for now we reject them.)
|
let Ok(val) = ecx.read_immediate(place) else {
|
||||||
let Ok(val) = ecx.read_scalar(place) else {
|
|
||||||
return Err(ValTreeCreationError::Other);
|
return Err(ValTreeCreationError::Other);
|
||||||
};
|
};
|
||||||
|
// We could allow wide raw pointers where both sides are integers in the future,
|
||||||
|
// but for now we reject them.
|
||||||
|
if matches!(val.layout.abi, Abi::ScalarPair(..)) {
|
||||||
|
return Err(ValTreeCreationError::Other);
|
||||||
|
}
|
||||||
|
let val = val.to_scalar();
|
||||||
// We are in the CTFE machine, so ptr-to-int casts will fail.
|
// We are in the CTFE machine, so ptr-to-int casts will fail.
|
||||||
// This can only be `Ok` if `val` already is an integer.
|
// This can only be `Ok` if `val` already is an integer.
|
||||||
let Ok(val) = val.try_to_int() else {
|
let Ok(val) = val.try_to_int() else {
|
||||||
|
@ -23,10 +23,18 @@ fn foo2(x: *const u8) {
|
|||||||
|
|
||||||
const D: *const [u8; 4] = b"abcd";
|
const D: *const [u8; 4] = b"abcd";
|
||||||
|
|
||||||
|
const STR: *const str = "abcd";
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
match D {
|
match D {
|
||||||
D => {} //~ERROR: behave unpredictably
|
D => {} //~ERROR: behave unpredictably
|
||||||
//~| previously accepted
|
//~| previously accepted
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
match STR {
|
||||||
|
STR => {} //~ERROR: behave unpredictably
|
||||||
|
//~| previously accepted
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ LL | C_INNER => {}
|
|||||||
= note: for more information, see issue #62411 <https://github.com/rust-lang/rust/issues/70861>
|
= note: for more information, see issue #62411 <https://github.com/rust-lang/rust/issues/70861>
|
||||||
|
|
||||||
error: function pointers and raw pointers not derived from integers in patterns behave unpredictably and should not be relied upon. See https://github.com/rust-lang/rust/issues/70861 for details.
|
error: function pointers and raw pointers not derived from integers in patterns behave unpredictably and should not be relied upon. See https://github.com/rust-lang/rust/issues/70861 for details.
|
||||||
--> $DIR/issue-34784-match-on-non-int-raw-ptr.rs:28:9
|
--> $DIR/issue-34784-match-on-non-int-raw-ptr.rs:30:9
|
||||||
|
|
|
|
||||||
LL | D => {}
|
LL | D => {}
|
||||||
| ^
|
| ^
|
||||||
@ -30,5 +30,14 @@ LL | D => {}
|
|||||||
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||||
= note: for more information, see issue #62411 <https://github.com/rust-lang/rust/issues/70861>
|
= note: for more information, see issue #62411 <https://github.com/rust-lang/rust/issues/70861>
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: function pointers and raw pointers not derived from integers in patterns behave unpredictably and should not be relied upon. See https://github.com/rust-lang/rust/issues/70861 for details.
|
||||||
|
--> $DIR/issue-34784-match-on-non-int-raw-ptr.rs:36:9
|
||||||
|
|
|
||||||
|
LL | STR => {}
|
||||||
|
| ^^^
|
||||||
|
|
|
||||||
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||||
|
= note: for more information, see issue #62411 <https://github.com/rust-lang/rust/issues/70861>
|
||||||
|
|
||||||
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user