about summary refs log tree commit diff
path: root/tests/ui/raw-ref-op
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2024-09-05 07:02:26 -0400
committerMichael Goulet <michael@errs.io>2024-10-05 18:36:47 -0400
commit6371ef6e964a72ca3b4c7557312d8808e98f4ff3 (patch)
tree9e66de863d98c67ed1d623e12c9d4553b2b0de26 /tests/ui/raw-ref-op
parent9096f4fafa2ac2d771f866337b4ee7064cde8575 (diff)
downloadrust-6371ef6e964a72ca3b4c7557312d8808e98f4ff3.tar.gz
rust-6371ef6e964a72ca3b4c7557312d8808e98f4ff3.zip
Evaluating place expr that is never read from does not diverge
Diffstat (limited to 'tests/ui/raw-ref-op')
-rw-r--r--tests/ui/raw-ref-op/never-place-isnt-diverging.rs13
-rw-r--r--tests/ui/raw-ref-op/never-place-isnt-diverging.stderr20
2 files changed, 33 insertions, 0 deletions
diff --git a/tests/ui/raw-ref-op/never-place-isnt-diverging.rs b/tests/ui/raw-ref-op/never-place-isnt-diverging.rs
new file mode 100644
index 00000000000..52f4158dbc9
--- /dev/null
+++ b/tests/ui/raw-ref-op/never-place-isnt-diverging.rs
@@ -0,0 +1,13 @@
+#![feature(never_type)]
+
+fn make_up_a_value<T>() -> T {
+    unsafe {
+    //~^ ERROR mismatched types
+        let x: *const ! = 0 as _;
+        &raw const *x;
+        // Since `*x` is `!`, HIR typeck used to think that it diverges
+        // and allowed the block to coerce to any value, leading to UB.
+    }
+}
+
+fn main() {}
diff --git a/tests/ui/raw-ref-op/never-place-isnt-diverging.stderr b/tests/ui/raw-ref-op/never-place-isnt-diverging.stderr
new file mode 100644
index 00000000000..9eba57dde8f
--- /dev/null
+++ b/tests/ui/raw-ref-op/never-place-isnt-diverging.stderr
@@ -0,0 +1,20 @@
+error[E0308]: mismatched types
+  --> $DIR/never-place-isnt-diverging.rs:4:5
+   |
+LL |   fn make_up_a_value<T>() -> T {
+   |                      - expected this type parameter
+LL | /     unsafe {
+LL | |
+LL | |         let x: *const ! = 0 as _;
+LL | |         &raw const *x;
+LL | |         // Since `*x` is `!`, HIR typeck used to think that it diverges
+LL | |         // and allowed the block to coerce to any value, leading to UB.
+LL | |     }
+   | |_____^ expected type parameter `T`, found `()`
+   |
+   = note: expected type parameter `T`
+                   found unit type `()`
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0308`.