[Sema] Fix ExtVectorElementExpr tree transform for the isArrow case.

Make sure we propagate the value for `IsArrow` to
`RebuildExtVectorElementExpr` in order to be able to handle correctly
vector component accesses where the base value is a pointer.

Reviewed By: rjmccall

Differential Revision: https://reviews.llvm.org/D131698
This commit is contained in:
Michele Scandale 2022-10-11 13:28:59 -07:00
parent 52c7ffbe2e
commit c49cde6467
2 changed files with 21 additions and 15 deletions

View File

@ -2814,20 +2814,18 @@ public:
///
/// By default, performs semantic analysis to build the new expression.
/// Subclasses may override this routine to provide different behavior.
ExprResult RebuildExtVectorElementExpr(Expr *Base,
SourceLocation OpLoc,
SourceLocation AccessorLoc,
IdentifierInfo &Accessor) {
ExprResult RebuildExtVectorElementExpr(Expr *Base, SourceLocation OpLoc,
bool IsArrow,
SourceLocation AccessorLoc,
IdentifierInfo &Accessor) {
CXXScopeSpec SS;
DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
OpLoc, /*IsArrow*/ false,
SS, SourceLocation(),
/*FirstQualifierInScope*/ nullptr,
NameInfo,
/* TemplateArgs */ nullptr,
/*S*/ nullptr);
return getSema().BuildMemberReferenceExpr(
Base, Base->getType(), OpLoc, IsArrow, SS, SourceLocation(),
/*FirstQualifierInScope*/ nullptr, NameInfo,
/* TemplateArgs */ nullptr,
/*S*/ nullptr);
}
/// Build a new initializer list expression.
@ -11424,9 +11422,9 @@ TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
// FIXME: Bad source location
SourceLocation FakeOperatorLoc =
SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
E->getAccessorLoc(),
E->getAccessor());
return getDerived().RebuildExtVectorElementExpr(
Base.get(), FakeOperatorLoc, E->isArrow(), E->getAccessorLoc(),
E->getAccessor());
}
template<typename Derived>

View File

@ -18,7 +18,15 @@ struct ExtVectorAccess0 {
template struct ExtVectorAccess0<double2>;
template struct ExtVectorAccess0<double4>;
typedef __attribute__(( ext_vector_type(2) )) double double2;
template<typename T>
struct ExtVectorAccess1 {
void f(T *v1, double4 *v2) {
v1->xy = v2->yx;
}
};
template struct ExtVectorAccess1<double2>;
template struct ExtVectorAccess1<double4>;
template<typename T, typename U, int N, int M>
struct ShuffleVector0 {