[clang] [clang][bytecode] fix assertion failure on invalid init list (GH175432) (PR #180261)

via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 6 10:51:39 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Serosh (Serosh-commits)

<details>
<summary>Changes</summary>

this fixes an assertion failure where the interpreter would crash on invalid initializer lists 
The problem was that we kept processing expressions even after they were flagged with errors. this led to bad state and the eventual crash so i  added checks for `containsErrors()` in compiler.cpp and other entry points so we bail out early instead of asserting.
fixes #<!-- -->175432

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


2 Files Affected:

- (modified) clang/lib/AST/ByteCode/Compiler.cpp (+21-2) 
- (added) clang/test/AST/ByteCode/gh175432.cpp (+4) 


``````````diff
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index a0138c402e143..a5a9f1e2e440d 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -211,6 +211,9 @@ template <class Emitter> class LocOverrideScope final {
 
 template <class Emitter>
 bool Compiler<Emitter>::VisitCastExpr(const CastExpr *CE) {
+  if (CE->containsErrors())
+    return false;
+
   const Expr *SubExpr = CE->getSubExpr();
 
   if (DiscardResult)
@@ -477,8 +480,6 @@ bool Compiler<Emitter>::VisitCastExpr(const CastExpr *CE) {
     return this->delegate(SubExpr);
 
   case CK_BitCast: {
-    if (CE->containsErrors())
-      return false;
     QualType CETy = CE->getType();
     // Reject bitcasts to atomic types.
     if (CETy->isAtomicType()) {
@@ -1836,6 +1837,9 @@ bool Compiler<Emitter>::VisitArraySubscriptExpr(const ArraySubscriptExpr *E) {
 template <class Emitter>
 bool Compiler<Emitter>::visitInitList(ArrayRef<const Expr *> Inits,
                                       const Expr *ArrayFiller, const Expr *E) {
+  if (E->containsErrors())
+    return false;
+
   InitLinkScope<Emitter> ILS(this, InitLink::InitList());
 
   QualType QT = E->getType();
@@ -4264,12 +4268,18 @@ bool Compiler<Emitter>::VisitStmtExpr(const StmtExpr *E) {
 }
 
 template <class Emitter> bool Compiler<Emitter>::discard(const Expr *E) {
+  if (E->containsErrors())
+    return false;
+
   OptionScope<Emitter> Scope(this, /*NewDiscardResult=*/true,
                              /*NewInitializing=*/false, /*ToLValue=*/false);
   return this->Visit(E);
 }
 
 template <class Emitter> bool Compiler<Emitter>::delegate(const Expr *E) {
+  if (E->containsErrors())
+    return false;
+
   // We're basically doing:
   // OptionScope<Emitter> Scope(this, DicardResult, Initializing, ToLValue);
   // but that's unnecessary of course.
@@ -4302,6 +4312,9 @@ static const Expr *stripDerivedToBaseCasts(const Expr *E) {
 }
 
 template <class Emitter> bool Compiler<Emitter>::visit(const Expr *E) {
+  if (E->containsErrors())
+    return false;
+
   if (E->getType().isNull())
     return false;
 
@@ -4330,6 +4343,9 @@ template <class Emitter> bool Compiler<Emitter>::visit(const Expr *E) {
 
 template <class Emitter>
 bool Compiler<Emitter>::visitInitializer(const Expr *E) {
+  if (E->containsErrors())
+    return false;
+
   assert(!canClassify(E->getType()));
 
   OptionScope<Emitter> Scope(this, /*NewDiscardResult=*/false,
@@ -4338,6 +4354,9 @@ bool Compiler<Emitter>::visitInitializer(const Expr *E) {
 }
 
 template <class Emitter> bool Compiler<Emitter>::visitAsLValue(const Expr *E) {
+  if (E->containsErrors())
+    return false;
+
   OptionScope<Emitter> Scope(this, /*NewDiscardResult=*/false,
                              /*NewInitializing=*/false, /*ToLValue=*/true);
   return this->Visit(E);
diff --git a/clang/test/AST/ByteCode/gh175432.cpp b/clang/test/AST/ByteCode/gh175432.cpp
new file mode 100644
index 0000000000000..9433a83c76f56
--- /dev/null
+++ b/clang/test/AST/ByteCode/gh175432.cpp
@@ -0,0 +1,4 @@
+// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -verify %s
+
+constexpr const int *foo[][2] = { {nullptr, int}, }; // expected-error {{expected expression}}
+static_assert(foo[0][0] == nullptr, "");

``````````

</details>


https://github.com/llvm/llvm-project/pull/180261


More information about the cfe-commits mailing list