llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: ahmed mohamed kamel (AhmedKamel10)

<details>
<summary>Changes</summary>

Fixes integer promotion for bit-fields used in statement expressions (#<!-- 
-->221542).

`Expr::getSourceBitField()` now looks through the final expression of a 
statement expression to preserve the bit-field information. This allows the 
existing integer promotion rules to correctly promote the bit-field to `int`.

Also added a regression test for the issue.



---
Full diff: https://github.com/llvm/llvm-project/pull/225597.diff


2 Files Affected:

- (modified) clang/lib/AST/Expr.cpp (+7) 
- (modified) clang/test/Sema/stmtexprs.c (+9) 


``````````diff
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
index 6ce0a29aa3bd7..728be799c50a3 100644
--- a/clang/lib/AST/Expr.cpp
+++ b/clang/lib/AST/Expr.cpp
@@ -4273,6 +4273,13 @@ FieldDecl *Expr::getSourceBitField() {
       break;
   }
 
+  if (StmtExpr *SE = dyn_cast<StmtExpr>(E)) {
+    CompoundStmt *CS = SE->getSubStmt();
+    if (ValueStmt *VS = dyn_cast_or_null<ValueStmt>(CS->body_back()))
+      if (Expr *EX = VS->getExprStmt())
+        return EX->getSourceBitField();
+  }
+
   if (MemberExpr *MemRef = dyn_cast<MemberExpr>(E))
     if (FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl()))
       if (Field->isBitField())
diff --git a/clang/test/Sema/stmtexprs.c b/clang/test/Sema/stmtexprs.c
index 7493bbcef363d..b5fd9c21226b4 100644
--- a/clang/test/Sema/stmtexprs.c
+++ b/clang/test/Sema/stmtexprs.c
@@ -7,3 +7,12 @@ void stmtexprs(int i) {
   // expected-warning@+1 {{assumption is ignored because it contains 
(potential) side-effects}}
   __builtin_assume( ({ if (i) ({ stmtexpr_fn(); }); 1; }) );
 }
+
+struct S {
+  unsigned b : 3;
+};
+
+void test_bitfield_promotion(struct S s) {
+  _Static_assert(_Generic(+({ s.b; }), int: 1, unsigned: 2) == 1,
+                 "bit-field in statement expression should be promoted");
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/225597
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to