| //! Check that we lose the information that `BAR` points to `FOO` | |
| //! when going through a const generic. | |
| //! This is not an intentional guarantee, it just describes the status quo. | |
| //@ run-pass | |
| //@ ignore-backends: gcc | |
| // With optimizations, LLVM will deduplicate the constant `X` whose | |
| // value is `&42` to just be a reference to the static. This is correct, | |
| // but obscures the issue we're trying to show. | |
| //@ revisions: opt noopt | |
| //@[noopt] compile-flags: -Copt-level=0 | |
| //@[opt] compile-flags: -O | |
| #![feature(adt_const_params, unsized_const_params)] | |
| #![allow(incomplete_features)] | |
| static FOO: usize = 42; | |
| const BAR: &usize = &FOO; | |
| fn foo<const X: &'static usize>() { | |
| // Without optimizations, `X` ends up pointing to a copy of `FOO` instead of `FOO` itself. | |
| assert_eq!(cfg!(opt), std::ptr::eq(X, &FOO)); | |
| } | |
| fn main() { | |
| foo::<BAR>(); | |
| } |