about summary refs log tree commit diff
path: root/tests/ui/inline-const
diff options
context:
space:
mode:
authorDylan DPC <99973273+Dylan-DPC@users.noreply.github.com>2023-07-19 22:37:08 +0530
committerGitHub <noreply@github.com>2023-07-19 22:37:08 +0530
commit6c3cbcd333eebb0fd9d2cf905ca6e376c4672107 (patch)
treeb16634a8c0484f9edfe944965d307d209d442881 /tests/ui/inline-const
parentc7c89140b00327eb22b00f8962bd75c10d58e219 (diff)
parent719797949ab1122d92a608b3f11f3321166b02eb (diff)
downloadrust-6c3cbcd333eebb0fd9d2cf905ca6e376c4672107.tar.gz
rust-6c3cbcd333eebb0fd9d2cf905ca6e376c4672107.zip
Rollup merge of #113803 - compiler-errors:const-interp-block, r=fee1-dead
Fix inline_const with interpolated block

Interpolation already worked when we had a `const $block` that wasn't a statement expr:

```
fn foo() {
  let _ = const $block;
}
```

But it was failing when the const block was in statement expr position:

```
fn foo() {
  const $block;
}
```

... because of a bug in a check for const items. This fixes that.

---

cc https://github.com/rust-lang/rust/pull/112953#issuecomment-1631354481, though I don't think this requires an FCP since it's already supported in exprs and seems to me to be fully a parser bug.
Diffstat (limited to 'tests/ui/inline-const')
-rw-r--r--tests/ui/inline-const/interpolated.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/tests/ui/inline-const/interpolated.rs b/tests/ui/inline-const/interpolated.rs
new file mode 100644
index 00000000000..3fcc621c946
--- /dev/null
+++ b/tests/ui/inline-const/interpolated.rs
@@ -0,0 +1,32 @@
+// check-pass
+
+#![feature(inline_const)]
+
+// This used to be unsupported since the parser first tries to check if we have
+// any nested items, and then checks for statements (and expressions). The heuristic
+// that we were using to detect the beginning of a const item was incorrect, so
+// this used to fail.
+macro_rules! m {
+    ($b:block) => {
+        fn foo() {
+            const $b
+        }
+    }
+}
+
+// This has worked since inline-consts were implemented, since the position that
+// the const block is located at doesn't support nested items (e.g. because
+// `let x = const X: u32 = 1;` is invalid), so there's no ambiguity parsing the
+// inline const.
+macro_rules! m2 {
+    ($b:block) => {
+        fn foo2() {
+            let _ = const $b;
+        }
+    }
+}
+
+m!({});
+m2!({});
+
+fn main() {}