about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLeón Orell Valerian Liehr <me@fmease.dev>2024-12-13 18:08:32 +0100
committerLeón Orell Valerian Liehr <me@fmease.dev>2024-12-13 18:36:05 +0100
commitf1d2a6a34b05bb0f8e3da284fcc484b360638846 (patch)
tree33567f41952d23735a713c0b96e15244baac8e63
parent4606a4d6fab93e53b54a4312c82e715eab8e122d (diff)
downloadrust-f1d2a6a34b05bb0f8e3da284fcc484b360638846.tar.gz
rust-f1d2a6a34b05bb0f8e3da284fcc484b360638846.zip
Add check-pass test for `&raw`
-rw-r--r--tests/ui/raw-ref-op/amp-raw-without-mut-const-is-a-normal-borrow.rs30
1 files changed, 30 insertions, 0 deletions
diff --git a/tests/ui/raw-ref-op/amp-raw-without-mut-const-is-a-normal-borrow.rs b/tests/ui/raw-ref-op/amp-raw-without-mut-const-is-a-normal-borrow.rs
new file mode 100644
index 00000000000..9360146a0fc
--- /dev/null
+++ b/tests/ui/raw-ref-op/amp-raw-without-mut-const-is-a-normal-borrow.rs
@@ -0,0 +1,30 @@
+//! The token sequence `&raw` *only* starts a raw borrow expr if it's immediately
+//! followed by either `const` or `mut`. If that's not the case, the `&` denotes
+//! the start of a normal borrow expr where `raw` is interpreted as a regular
+//! identifier and thus denotes the start of a path expr.
+//!
+//! This test ensures that we never commit too early/overzealously in the parser
+//! when encountering the sequence `&raw` (even during parse error recovery) so
+//! as not to regress preexisting code.
+
+//@ check-pass
+
+fn main() { // the odd formatting in here is intentional
+    let raw = 0;
+    let _ = &raw;
+
+    let raw = 0;
+    let local = 1;
+    let _: i32 = &raw *local;
+
+    let raw = |_| ();
+    let local = [0];
+    let () = &raw (local[0]);
+}
+
+macro_rules! check {
+    ($e:expr) => { compile_error!("expr"); };
+    (&raw $e:expr) => {};
+}
+
+check!(&raw local);