From feaa5aa840dcda69bd4133536142be882f696114 Mon Sep 17 00:00:00 2001 From: Akira Hatanaka Date: Thu, 24 Apr 2025 08:47:29 -0700 Subject: [PATCH] Fix a crash in constant evaluation of ExtVectorElementExprs (#136771) Handle the case where the base expression is a pointer to a vector type. rdar://149223362 --- clang/lib/AST/ExprConstant.cpp | 5 ++++- clang/test/SemaCXX/constexpr-vectors-access-elements.cpp | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 7c933f47bf7f..f2e49b9ea669 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -9202,7 +9202,10 @@ bool LValueExprEvaluator::VisitExtVectorElementExpr( if (Success) { Result.setFrom(Info.Ctx, Val); - const auto *VT = E->getBase()->getType()->castAs(); + QualType BaseType = E->getBase()->getType(); + if (E->isArrow()) + BaseType = BaseType->getPointeeType(); + const auto *VT = BaseType->castAs(); HandleLValueVectorElement(Info, E, Result, VT->getElementType(), VT->getNumElements(), Indices[0]); } diff --git a/clang/test/SemaCXX/constexpr-vectors-access-elements.cpp b/clang/test/SemaCXX/constexpr-vectors-access-elements.cpp index 08223e15feb7..58efcde414af 100644 --- a/clang/test/SemaCXX/constexpr-vectors-access-elements.cpp +++ b/clang/test/SemaCXX/constexpr-vectors-access-elements.cpp @@ -43,4 +43,6 @@ static_assert(b.lo.lo == 1); // expected-error {{not an integral constant expres // make sure clang rejects taking address of a vector element static_assert(&b[1]); // expected-error {{address of vector element requested}} +constexpr const FourIntsExtVec *p = &b; +static_assert(p->x == 1); }