mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-27 23:51:56 +00:00
[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:
parent
52c7ffbe2e
commit
c49cde6467
@ -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>
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user