[PATCH] D131698: [Sema] Fix `ExtVectorElementExpr` tree transform for the `isArrow` case.

Michele Scandale via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Aug 11 10:40:15 PDT 2022


michele.scandale created this revision.
michele.scandale added reviewers: rsmith, doug.gregor, rjmccall.
Herald added a project: All.
michele.scandale requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

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.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D131698

Files:
  clang/lib/Sema/TreeTransform.h
  clang/test/SemaTemplate/instantiate-clang.cpp


Index: clang/test/SemaTemplate/instantiate-clang.cpp
===================================================================
--- clang/test/SemaTemplate/instantiate-clang.cpp
+++ clang/test/SemaTemplate/instantiate-clang.cpp
@@ -18,7 +18,15 @@
 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 {
Index: clang/lib/Sema/TreeTransform.h
===================================================================
--- clang/lib/Sema/TreeTransform.h
+++ clang/lib/Sema/TreeTransform.h
@@ -2779,15 +2779,15 @@
   ///
   /// 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,
+                                              OpLoc, IsArrow,
                                               SS, SourceLocation(),
                                               /*FirstQualifierInScope*/ nullptr,
                                               NameInfo,
@@ -11385,9 +11385,9 @@
   // 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>


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D131698.451910.patch
Type: text/x-patch
Size: 2632 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220811/8d29adec/attachment.bin>


More information about the cfe-commits mailing list