Author: Michele Scandale Date: 2022-10-11T13:29:20-07:00 New Revision: c49cde6467f9bf200640db763152a9dc7f009520
URL: https://github.com/llvm/llvm-project/commit/c49cde6467f9bf200640db763152a9dc7f009520 DIFF: https://github.com/llvm/llvm-project/commit/c49cde6467f9bf200640db763152a9dc7f009520.diff LOG: [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 Added: Modified: clang/lib/Sema/TreeTransform.h clang/test/SemaTemplate/instantiate-clang.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 82b6cfacf46b6..d772d7f69d80f 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -2814,20 +2814,18 @@ class TreeTransform { /// /// By default, performs semantic analysis to build the new expression. /// Subclasses may override this routine to provide diff erent 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> diff --git a/clang/test/SemaTemplate/instantiate-clang.cpp b/clang/test/SemaTemplate/instantiate-clang.cpp index 34d68c4e59fd5..18b428834b0a2 100644 --- a/clang/test/SemaTemplate/instantiate-clang.cpp +++ b/clang/test/SemaTemplate/instantiate-clang.cpp @@ -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 { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits