https://github.com/tbaederr updated 
https://github.com/llvm/llvm-project/pull/205555

>From a89a3525e959887506386de581ce35e68d94f18b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <[email protected]>
Date: Wed, 24 Jun 2026 15:13:26 +0200
Subject: [PATCH] indet

---
 clang/lib/AST/ByteCode/Compiler.cpp               |  9 +++++++++
 clang/test/AST/ByteCode/evaluate-dtor-codegen.cpp | 14 ++++++++++++++
 2 files changed, 23 insertions(+)
 create mode 100644 clang/test/AST/ByteCode/evaluate-dtor-codegen.cpp

diff --git a/clang/lib/AST/ByteCode/Compiler.cpp 
b/clang/lib/AST/ByteCode/Compiler.cpp
index a74bea26f5c28..d2e28e516eaab 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -5421,6 +5421,7 @@ bool Compiler<Emitter>::visitDtorCall(const VarDecl *VD, 
const APValue &Value) {
 template <class Emitter>
 bool Compiler<Emitter>::visitAPValue(const APValue &Val, PrimType ValType,
                                      SourceInfo Info) {
+  assert(!Val.isIndeterminate() && "Needs to be checked before");
   assert(!DiscardResult);
   if (Val.isInt())
     return this->emitConst(Val.getInt(), ValType, Info);
@@ -5510,6 +5511,8 @@ bool Compiler<Emitter>::visitAPValueInitializer(const 
APValue &Val,
     assert(R);
     for (unsigned I = 0, N = Val.getStructNumFields(); I != N; ++I) {
       const APValue &F = Val.getStructField(I);
+      if (F.isIndeterminate())
+        continue;
       const Record::Field *RF = R->getField(I);
       QualType FieldType = RF->Decl->getType();
 
@@ -5537,6 +5540,8 @@ bool Compiler<Emitter>::visitAPValueInitializer(const 
APValue &Val,
       if (I >= R->getNumBases())
         break;
       const APValue &B = Val.getStructBase(I);
+      if (B.isIndeterminate())
+        continue;
       const Record::Base *RB = R->getBase(I);
       QualType BaseType = Ctx.getASTContext().getCanonicalTagType(RB->Decl);
 
@@ -5557,6 +5562,8 @@ bool Compiler<Emitter>::visitAPValueInitializer(const 
APValue &Val,
     const Record *R = this->getRecord(T);
     assert(R);
     const APValue &F = Val.getUnionValue();
+    if (F.isIndeterminate())
+      return true;
     const Record::Field *RF = R->getField(UnionField);
     QualType FieldType = RF->Decl->getType();
 
@@ -5587,6 +5594,8 @@ bool Compiler<Emitter>::visitAPValueInitializer(const 
APValue &Val,
       const APValue &Elem = A >= InitializedElems
                                 ? Val.getArrayFiller()
                                 : Val.getArrayInitializedElt(A);
+      if (Elem.isIndeterminate())
+        continue;
 
       if (ElemT) {
         if (!this->visitAPValue(Elem, *ElemT, Info))
diff --git a/clang/test/AST/ByteCode/evaluate-dtor-codegen.cpp 
b/clang/test/AST/ByteCode/evaluate-dtor-codegen.cpp
new file mode 100644
index 0000000000000..24b17cceb8e41
--- /dev/null
+++ b/clang/test/AST/ByteCode/evaluate-dtor-codegen.cpp
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 -std=c++20 -verify=both,expected %s -Wexit-time-destructors 
-fexperimental-new-constant-interpreter
+// RUN: %clang_cc1 -std=c++20 -verify=both,ref      %s -Wexit-time-destructors
+
+// both-no-diagnostics
+
+struct S {
+  int a;
+  constexpr S() {}
+  constexpr ~S() {
+  }
+};
+S s{};
+
+

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

Reply via email to