-
Notifications
You must be signed in to change notification settings - Fork 13.5k
Fix a crash in constant evaluation of ExtVectorElementExprs #136771
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Handle the case where the base expression is a pointer to a vector type. rdar://149223362
@llvm/pr-subscribers-clang Author: Akira Hatanaka (ahatanak) ChangesHandle the case where the base expression is a pointer to a vector type. rdar://149223362 Full diff: https://github.com/llvm/llvm-project/pull/136771.diff 2 Files Affected:
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index f598ef5929aa4..fd870c84796a5 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -9197,7 +9197,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);
}
|
@@ -9197,7 +9197,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()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm a little surprised this isn't already handled in the AST. I would expect the sub-expression to be a dereference
of the vector type in the AST instead to having to do this (for the same reason that I would expect *vecTyPtr
to have one).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is sub-expression
the base expression in this case? For ExtVectorElementExpr
, the base expression is whatever the LHS of ->
or .
is and that decision was made a long time ago. I think MemberExpr
's base expression can be a pointer type too.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah, huh, I didn't realize that about MemberExpr
, I guess this IS consistent. Odd choice that we made...
Handle the case where the base expression is a pointer to a vector type.
rdar://149223362