about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTakayuki Maeda <takoyaki0316@gmail.com>2025-04-05 06:09:14 +0900
committerTakayuki Maeda <takoyaki0316@gmail.com>2025-04-05 06:09:14 +0900
commit6b5ccfc87f59ab017032e430d4d358b4989735da (patch)
tree142a23431eb04d0f18d51b6992887c6f6babd1de
parentae9173d7dd4a31806c950c90dcc331f1508b4d17 (diff)
downloadrust-6b5ccfc87f59ab017032e430d4d358b4989735da.tar.gz
rust-6b5ccfc87f59ab017032e430d4d358b4989735da.zip
check if merged attributes list is empty
-rw-r--r--compiler/rustc_ast_lowering/src/expr.rs16
-rw-r--r--tests/ui/attributes/invalid-reprs.rs6
-rw-r--r--tests/ui/attributes/invalid-reprs.stderr33
3 files changed, 48 insertions, 7 deletions
diff --git a/compiler/rustc_ast_lowering/src/expr.rs b/compiler/rustc_ast_lowering/src/expr.rs
index 52291fdfb30..fc2aae5b27f 100644
--- a/compiler/rustc_ast_lowering/src/expr.rs
+++ b/compiler/rustc_ast_lowering/src/expr.rs
@@ -74,14 +74,16 @@ impl<'hir> LoweringContext<'_, 'hir> {
                     // Merge attributes into the inner expression.
                     if !e.attrs.is_empty() {
                         let old_attrs = self.attrs.get(&ex.hir_id.local_id).copied().unwrap_or(&[]);
-                        self.attrs.insert(
-                            ex.hir_id.local_id,
-                            &*self.arena.alloc_from_iter(
-                                self.lower_attrs_vec(&e.attrs, e.span)
-                                    .into_iter()
-                                    .chain(old_attrs.iter().cloned()),
-                            ),
+                        let attrs = &*self.arena.alloc_from_iter(
+                            self.lower_attrs_vec(&e.attrs, e.span)
+                                .into_iter()
+                                .chain(old_attrs.iter().cloned()),
                         );
+                        if attrs.is_empty() {
+                            return ex;
+                        }
+
+                        self.attrs.insert(ex.hir_id.local_id, attrs);
                     }
                     return ex;
                 }
diff --git a/tests/ui/attributes/invalid-reprs.rs b/tests/ui/attributes/invalid-reprs.rs
new file mode 100644
index 00000000000..95ed14b5491
--- /dev/null
+++ b/tests/ui/attributes/invalid-reprs.rs
@@ -0,0 +1,6 @@
+fn main() {
+    let y = #[repr(uwu(4))]
+    //~^ ERROR attributes on expressions are experimental
+    //~| ERROR unrecognized representation hint
+    (&id(5)); //~ ERROR: cannot find function `id` in this scope
+}
diff --git a/tests/ui/attributes/invalid-reprs.stderr b/tests/ui/attributes/invalid-reprs.stderr
new file mode 100644
index 00000000000..415b969b244
--- /dev/null
+++ b/tests/ui/attributes/invalid-reprs.stderr
@@ -0,0 +1,33 @@
+error[E0658]: attributes on expressions are experimental
+  --> $DIR/invalid-reprs.rs:2:13
+   |
+LL |     let y = #[repr(uwu(4))]
+   |             ^^^^^^^^^^^^^^^
+   |
+   = note: see issue #15701 <https://github.com/rust-lang/rust/issues/15701> for more information
+   = help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable
+   = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
+
+error[E0425]: cannot find function `id` in this scope
+  --> $DIR/invalid-reprs.rs:5:7
+   |
+LL |     (&id(5));
+   |       ^^ not found in this scope
+   |
+help: consider importing this function
+   |
+LL + use std::process::id;
+   |
+
+error[E0552]: unrecognized representation hint
+  --> $DIR/invalid-reprs.rs:2:20
+   |
+LL |     let y = #[repr(uwu(4))]
+   |                    ^^^^^^
+   |
+   = help: valid reprs are `Rust` (default), `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize`
+
+error: aborting due to 3 previous errors
+
+Some errors have detailed explanations: E0425, E0552, E0658.
+For more information about an error, try `rustc --explain E0425`.