about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--tests/ui/mir/auxiliary/static_fnptr.rs11
-rw-r--r--tests/ui/mir/static_fnptr.rs21
2 files changed, 32 insertions, 0 deletions
diff --git a/tests/ui/mir/auxiliary/static_fnptr.rs b/tests/ui/mir/auxiliary/static_fnptr.rs
new file mode 100644
index 00000000000..8c7347175f4
--- /dev/null
+++ b/tests/ui/mir/auxiliary/static_fnptr.rs
@@ -0,0 +1,11 @@
+//@ compile-flags:-O
+
+#[inline]
+fn foo() {}
+
+pub static ADDR: fn() = foo;
+
+#[inline(always)]
+pub fn bar(x: fn()) -> bool {
+    x == ADDR
+}
diff --git a/tests/ui/mir/static_fnptr.rs b/tests/ui/mir/static_fnptr.rs
new file mode 100644
index 00000000000..6b1ec021629
--- /dev/null
+++ b/tests/ui/mir/static_fnptr.rs
@@ -0,0 +1,21 @@
+//! Verify that we correctly handle fn pointer provenance in MIR optimizations.
+//! By asking to inline `static_fnptr::bar`, we have two copies of `static_fnptr::foo`, one in the
+//! auxiliary crate and one in the local crate CGU.
+//! `baz` must only consider the versions from upstream crate, and not try to compare with the
+//! address of the CGU-local copy.
+//! Related issue: #123670
+
+//@ run-pass
+//@ compile-flags:-Cno-prepopulate-passes -Copt-level=0
+//@ aux-build:static_fnptr.rs
+
+extern crate static_fnptr;
+use static_fnptr::{ADDR, bar};
+
+fn baz() -> bool {
+    bar(ADDR)
+}
+
+fn main() {
+    assert!(baz())
+}