[clang] [clang] Fix crash constant-evaluating large arrays with initializer list or string literal (PR #229556)
Krisitan Erik Olsen via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 6 20:03:36 PDT 2026
https://github.com/Kristianerik updated https://github.com/llvm/llvm-project/pull/229556
>From f03b9c847831425b254e67a7d85988fe9b87b92f Mon Sep 17 00:00:00 2001
From: Kristianerik <kristian.erik at outlook.com>
Date: Tue, 6 Oct 2026 13:23:50 -0700
Subject: [PATCH] [Sema] Fix crash constant-evaluating large arrays with
initializer list or string literal
---
clang/lib/AST/ExprConstant.cpp | 11 +++++++++--
clang/test/Sema/gh227533.c | 8 ++++++++
2 files changed, 17 insertions(+), 2 deletions(-)
create mode 100644 clang/test/Sema/gh227533.c
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 34c3e39807c7f..b82caab970647 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -15627,10 +15627,14 @@ namespace {
bool VisitArrayInitLoopExpr(const ArrayInitLoopExpr *E);
bool VisitCXXConstructExpr(const CXXConstructExpr *E);
bool VisitCXXConstructExpr(const CXXConstructExpr *E,
- const LValue &Subobject,
- APValue *Value, QualType Type);
+ const LValue &Subobject, APValue *Value,
+ QualType Type);
bool VisitStringLiteral(const StringLiteral *E,
QualType AllocType = QualType()) {
+ const ConstantArrayType *CAT = Info.Ctx.getAsConstantArrayType(
+ AllocType.isNull() ? E->getType() : AllocType);
+ if (!CheckArraySize(Info, CAT, E->getExprLoc()))
+ return false;
expandStringLiteral(Info, E, Result, AllocType);
return true;
}
@@ -15770,6 +15774,9 @@ bool ArrayExprEvaluator::VisitCXXParenListOrInitListExpr(
bool Success = true;
+ if (!CheckArraySize(Info, CAT, ExprToVisit->getExprLoc()))
+ return false;
+
unsigned NumEltsToInit = Args.size();
unsigned NumElts = CAT->getZExtSize();
diff --git a/clang/test/Sema/gh227533.c b/clang/test/Sema/gh227533.c
new file mode 100644
index 0000000000000..3281b7c20d403
--- /dev/null
+++ b/clang/test/Sema/gh227533.c
@@ -0,0 +1,8 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fsyntax-only -verify %s
+// expected-no-diagnostics
+
+const char a[4294967296] = {0};
+int b(void) { return a[1]; }
+
+const char c[4294967296] = "x";
+int d(void) { return c[1]; }
More information about the cfe-commits
mailing list