about summary refs log tree commit diff
path: root/tests/codegen-llvm/read-only-capture-opt.rs
diff options
context:
space:
mode:
authorNikita Popov <npopov@redhat.com>2025-08-11 17:18:23 +0200
committerNikita Popov <npopov@redhat.com>2025-08-20 19:08:16 +0200
commitd71ed8d19bcfdbd6eb3bf2620071f2ab95470a57 (patch)
treee741340c424decbc74d41bf783747f1440e4ca10 /tests/codegen-llvm/read-only-capture-opt.rs
parent8365fcb2b840c95eeb0bc377af8bd498fad22245 (diff)
downloadrust-d71ed8d19bcfdbd6eb3bf2620071f2ab95470a57.tar.gz
rust-d71ed8d19bcfdbd6eb3bf2620071f2ab95470a57.zip
Tell LLVM about read-only captures
`&Freeze` parameters are not only `readonly` within the function,
but any captures of the pointer can also only be used for reads.
This can now be encoded using the `captures(address, read_provenance)`
attribute.
Diffstat (limited to 'tests/codegen-llvm/read-only-capture-opt.rs')
-rw-r--r--tests/codegen-llvm/read-only-capture-opt.rs18
1 files changed, 18 insertions, 0 deletions
diff --git a/tests/codegen-llvm/read-only-capture-opt.rs b/tests/codegen-llvm/read-only-capture-opt.rs
new file mode 100644
index 00000000000..78d56f8efc2
--- /dev/null
+++ b/tests/codegen-llvm/read-only-capture-opt.rs
@@ -0,0 +1,18 @@
+//@ compile-flags: -C opt-level=3 -Z mir-opt-level=0
+//@ min-llvm-version: 21
+
+#![crate_type = "lib"]
+
+unsafe extern "C" {
+    safe fn do_something(p: &i32);
+}
+
+#[unsafe(no_mangle)]
+pub fn test() -> i32 {
+    // CHECK-LABEL: @test(
+    // CHECK: ret i32 0
+    let i = 0;
+    do_something(&i);
+    do_something(&i);
+    i
+}