Skip to content

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

Merged
merged 1 commit into from
Apr 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion clang/lib/AST/ExprConstant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Copy link
Collaborator

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).

Copy link
Collaborator Author

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.

Copy link
Collaborator

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...

BaseType = BaseType->getPointeeType();
const auto *VT = BaseType->castAs<VectorType>();
HandleLValueVectorElement(Info, E, Result, VT->getElementType(),
VT->getNumElements(), Indices[0]);
}
Expand Down
2 changes: 2 additions & 0 deletions clang/test/SemaCXX/constexpr-vectors-access-elements.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Loading