mirror of
https://github.com/rust-lang/rust.git
synced 2025-09-28 13:46:03 +00:00
58 lines
1.8 KiB
Rust
58 lines
1.8 KiB
Rust
//@ test-mir-pass: GVN
|
|
//@ compile-flags: --crate-type lib
|
|
|
|
//! Regressions test for a mis-optimization where some functions
|
|
//! (`type_id` / `type_name` / `needs_drop`) could be evaluated in
|
|
//! a generic context, even though their value depends on some type
|
|
//! parameter `T`.
|
|
//!
|
|
//! In particular, `type_name_of_val(&generic::<T>)` was incorrectly
|
|
//! evaluated to the string "crate_name::generic::<T>", and
|
|
//! `no_optimize` was incorrectly optimized to `false`.
|
|
|
|
#![feature(const_type_name)]
|
|
|
|
fn generic<T>() {}
|
|
|
|
const fn type_name_contains_i32<T>(_: &T) -> bool {
|
|
let pattern = b"i32";
|
|
let name = std::any::type_name::<T>().as_bytes();
|
|
let mut i = 0;
|
|
'outer: while i < name.len() - pattern.len() + 1 {
|
|
let mut j = 0;
|
|
while j < pattern.len() {
|
|
if name[i + j] != pattern[j] {
|
|
i += 1;
|
|
continue 'outer;
|
|
}
|
|
j += 1;
|
|
}
|
|
return true;
|
|
}
|
|
false
|
|
}
|
|
|
|
// EMIT_MIR gvn_const_eval_polymorphic.optimize_true.GVN.diff
|
|
fn optimize_true<T>() -> bool {
|
|
// CHECK-LABEL: fn optimize_true(
|
|
// CHECK: _0 = const true;
|
|
// CHECK-NEXT: return;
|
|
(const { type_name_contains_i32(&generic::<i32>) }) == const { true }
|
|
}
|
|
|
|
// EMIT_MIR gvn_const_eval_polymorphic.optimize_false.GVN.diff
|
|
fn optimize_false<T>() -> bool {
|
|
// CHECK-LABEL: fn optimize_false(
|
|
// CHECK: _0 = const false;
|
|
// CHECK-NEXT: return;
|
|
(const { type_name_contains_i32(&generic::<i64>) }) == const { true }
|
|
}
|
|
|
|
// EMIT_MIR gvn_const_eval_polymorphic.no_optimize.GVN.diff
|
|
fn no_optimize<T>() -> bool {
|
|
// CHECK-LABEL: fn no_optimize(
|
|
// CHECK: _0 = Eq(const no_optimize::<T>::{constant#0}, const no_optimize::<T>::{constant#1});
|
|
// CHECK-NEXT: return;
|
|
(const { type_name_contains_i32(&generic::<T>) }) == const { true }
|
|
}
|