[clang] 35ecc7f - [clang][Sema] Fix PR47676: Handle dependent AltiVec C-style cast
Hubert Tong via cfe-commits
cfe-commits at lists.llvm.org
Thu Oct 1 12:57:10 PDT 2020
Author: Hubert Tong
Date: 2020-10-01T15:57:01-04:00
New Revision: 35ecc7fe49ba881a77e8146b51870a60a52b211f
URL: https://github.com/llvm/llvm-project/commit/35ecc7fe49ba881a77e8146b51870a60a52b211f
DIFF: https://github.com/llvm/llvm-project/commit/35ecc7fe49ba881a77e8146b51870a60a52b211f.diff
LOG: [clang][Sema] Fix PR47676: Handle dependent AltiVec C-style cast
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.
Reviewed By: aaron.ballman
Differential Revision: https://reviews.llvm.org/D88526
Added:
clang/test/SemaTemplate/pr47676.cpp
Modified:
clang/lib/Sema/SemaExpr.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 22840dd3dfe3..e51b27626184 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -7408,7 +7408,7 @@ Sema::ActOnCastExpr(Scope *S, SourceLocation LParenLoc,
}
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
diff --git a/clang/test/SemaTemplate/pr47676.cpp b/clang/test/SemaTemplate/pr47676.cpp
new file mode 100644
index 000000000000..428607097c96
--- /dev/null
+++ b/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
diff erentiate 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>
+}
More information about the cfe-commits
mailing list