Author: Hubert Tong Date: 2020-11-02T23:48:28-05:00 New Revision: 701addff1b713ee13d85daa0e3f7a0504d84b1af
URL: https://github.com/llvm/llvm-project/commit/701addff1b713ee13d85daa0e3f7a0504d84b1af DIFF: https://github.com/llvm/llvm-project/commit/701addff1b713ee13d85daa0e3f7a0504d84b1af.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 (cherry picked from commit 35ecc7fe49ba881a77e8146b51870a60a52b211f) 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 ccae79636f32..0b80ee613077 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -7401,7 +7401,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> +} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits