Author: Timm Baeder
Date: 2026-06-02T16:47:56+02:00
New Revision: 5d9e965c3f9983278308a00c282810e0f04754cc

URL: 
https://github.com/llvm/llvm-project/commit/5d9e965c3f9983278308a00c282810e0f04754cc
DIFF: 
https://github.com/llvm/llvm-project/commit/5d9e965c3f9983278308a00c282810e0f04754cc.diff

LOG: [clang][ExprConst] Support DesignatedInitUpdateExpr of array type (#201000)

I think this should work.

Added: 
    

Modified: 
    clang/lib/AST/ByteCode/Compiler.cpp
    clang/lib/AST/ExprConstant.cpp
    clang/test/Sema/constexpr.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/ByteCode/Compiler.cpp 
b/clang/lib/AST/ByteCode/Compiler.cpp
index 989a28dc2be14..99c3e8fa0924b 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -7836,7 +7836,6 @@ bool Compiler<Emitter>::VisitDeclRefExpr(const 
DeclRefExpr *E) {
 template <class Emitter>
 bool Compiler<Emitter>::VisitDesignatedInitUpdateExpr(
     const DesignatedInitUpdateExpr *E) {
-  assert(E->getType()->isRecordType());
   if (!this->visitInitializer(E->getBase()))
     return false;
   return this->visitInitializer(E->getUpdater());

diff  --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 7601d68b13939..f78854d15a9f2 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -15024,6 +15024,7 @@ namespace {
                                          ArrayRef<Expr *> Args,
                                          const Expr *ArrayFiller,
                                          QualType AllocType = QualType());
+    bool VisitDesignatedInitUpdateExpr(const DesignatedInitUpdateExpr *E);
   };
 } // end anonymous namespace
 
@@ -15411,6 +15412,13 @@ bool ArrayExprEvaluator::VisitCXXParenListInitExpr(
                                          E->getArrayFiller());
 }
 
+bool ArrayExprEvaluator::VisitDesignatedInitUpdateExpr(
+    const DesignatedInitUpdateExpr *E) {
+  if (!Visit(E->getBase()))
+    return false;
+  return Visit(E->getUpdater());
+}
+
 
//===----------------------------------------------------------------------===//
 // Integer Evaluation
 //

diff  --git a/clang/test/Sema/constexpr.c b/clang/test/Sema/constexpr.c
index cf029446bd362..51ee62d2495f3 100644
--- a/clang/test/Sema/constexpr.c
+++ b/clang/test/Sema/constexpr.c
@@ -446,3 +446,11 @@ static_assert(designated_init_b.a.d == 12.0); // 
expected-warning {{folding it t
 static_assert(designated_init_b.a.e[0] == 5); // expected-warning {{folding it 
to a constant is a GNU extension}}
 static_assert(designated_init_b.a.e[1] == 13); // expected-warning {{folding 
it to a constant is a GNU extension}}
 static_assert(designated_init_b.y == 14);
+
+struct S2 {
+  char L[4];
+  int M;
+};
+const struct S2 s2[2] = {{{"foo"}, 1}, [0].L[2] = 'x'}; // expected-warning 
{{initializer partially overrides prior initialization of this subobject}} \
+                                                        // expected-note 
{{previous initialization is here}}
+static_assert(s2[0].L[2] == 'x');// expected-warning {{folding it to a 
constant is a GNU extension}}


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

Reply via email to