[clang] feaa5aa - Fix a crash in constant evaluation of ExtVectorElementExprs (#136771)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 24 08:47:33 PDT 2025
Author: Akira Hatanaka
Date: 2025-04-24T08:47:29-07:00
New Revision: feaa5aa840dcda69bd4133536142be882f696114
URL: https://github.com/llvm/llvm-project/commit/feaa5aa840dcda69bd4133536142be882f696114
DIFF: https://github.com/llvm/llvm-project/commit/feaa5aa840dcda69bd4133536142be882f696114.diff
LOG: 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
Added:
Modified:
clang/lib/AST/ExprConstant.cpp
clang/test/SemaCXX/constexpr-vectors-access-elements.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 7c933f47bf7f0..f2e49b9ea669e 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<VectorType>();
+ QualType BaseType = E->getBase()->getType();
+ if (E->isArrow())
+ BaseType = BaseType->getPointeeType();
+ const auto *VT = BaseType->castAs<VectorType>();
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 08223e15feb72..58efcde414af2 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);
}
More information about the cfe-commits
mailing list