[PATCH] D88526: [clang][Sema] Fix PR47676: Handle dependent AltiVec C-style cast

Hubert Tong via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 29 21:53:12 PDT 2020


hubert.reinterpretcast created this revision.
hubert.reinterpretcast added reviewers: pkubaj, nemanjai, jasonliu, aaron.ballman.
Herald added a project: clang.
hubert.reinterpretcast requested review of this revision.

Fix premature decision in the presence of type-dependent expression operands on whether AltiVec vector initializations from single expressions are "splat" operations.

Verify that the instantiation is able to determine the correct cast semantics for both the scalar type and the vector type case.

Note that, because the change only affects the single-expression case (and the target type is an AltiVec-style vector type), the replacement of a parenthesized list with a parenthesized expression does not change the semantics of the program in a program-observable manner.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D88526

Files:
  clang/lib/Sema/SemaExpr.cpp
  clang/test/SemaTemplate/pr47676.cpp


Index: clang/test/SemaTemplate/pr47676.cpp
===================================================================
--- /dev/null
+++ clang/test/SemaTemplate/pr47676.cpp
@@ -0,0 +1,38 @@
+// RUN: %clang_cc1 -triple=powerpc64le-unknown-linux-gnu \
+// RUN:            -target-feature +altivec -fsyntax-only -ast-dump \
+// RUN:            -xc++ < %s 2>&1 \
+// RUN:   | FileCheck %s
+
+// Ensures that casts to AltiVec type with a dependent expression operand does
+// not hit the assertion failure reported in PR47676. Further checks that casts
+// to AltiVec type with a dependent expression operand is, on instantiation,
+// able to correctly differentiate between a splat case and a bitcast case.
+template <typename T> void f(T *tp) {
+  extern void g(int, ...);
+  g(0, (__vector int)(*tp));
+  g(0, (__vector int)*tp);
+}
+
+void g(void) {
+  f<__vector float>(nullptr);
+//      CHECK: | |-FunctionDecl {{.*}} f 'void (__vector float *)'
+
+//      CHECK: |   | `-CStyleCastExpr {{.*}} '__vector int' <NoOp>
+// CHECK-NEXT: |   |   `-ImplicitCastExpr {{.*}} '__vector int' <BitCast>
+// CHECK-NEXT: |   |     `-ImplicitCastExpr {{.*}}'__vector float' <LValueToRValue>
+
+//      CHECK: |     `-CStyleCastExpr {{.*}} '__vector int' <NoOp>
+// CHECK-NEXT: |       `-ImplicitCastExpr {{.*}} '__vector int' <BitCast>
+// CHECK-NEXT: |         `-ImplicitCastExpr {{.*}}'__vector float' <LValueToRValue>
+
+  f<double>(nullptr);
+//      CHECK: | `-FunctionDecl {{.*}} f 'void (double *)'
+
+//      CHECK: |     | `-CStyleCastExpr {{.*}} '__vector int' <VectorSplat>
+// CHECK-NEXT: |     |   `-ImplicitCastExpr {{.*}} 'int' <FloatingToIntegral>
+// CHECK-NEXT: |     |     `-ImplicitCastExpr {{.*}}'double' <LValueToRValue>
+
+//      CHECK: |       `-CStyleCastExpr {{.*}} '__vector int' <VectorSplat>
+// CHECK-NEXT: |         `-ImplicitCastExpr {{.*}} 'int' <FloatingToIntegral>
+// CHECK-NEXT: |           `-ImplicitCastExpr {{.*}}:'double' <LValueToRValue>
+}
Index: clang/lib/Sema/SemaExpr.cpp
===================================================================
--- clang/lib/Sema/SemaExpr.cpp
+++ clang/lib/Sema/SemaExpr.cpp
@@ -7408,7 +7408,7 @@
     }
     if (PE || PLE->getNumExprs() == 1) {
       Expr *E = (PE ? PE->getSubExpr() : PLE->getExpr(0));
-      if (!E->getType()->isVectorType())
+      if (!E->isTypeDependent() && !E->getType()->isVectorType())
         isVectorLiteral = true;
     }
     else


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D88526.295170.patch
Type: text/x-patch
Size: 2420 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200930/49a9a871/attachment.bin>


More information about the cfe-commits mailing list