diff options
-rw-r--r-- | lib/Sema/SemaTemplateInstantiateExpr.cpp | 19 | ||||
-rw-r--r-- | test/SemaTemplate/instantiate-clang.cpp | 35 | ||||
-rw-r--r-- | test/SemaTemplate/instantiate-expr-3.cpp | 36 |
3 files changed, 53 insertions, 37 deletions
diff --git a/lib/Sema/SemaTemplateInstantiateExpr.cpp b/lib/Sema/SemaTemplateInstantiateExpr.cpp index da4fb75b59..f20d699815 100644 --- a/lib/Sema/SemaTemplateInstantiateExpr.cpp +++ b/lib/Sema/SemaTemplateInstantiateExpr.cpp @@ -64,7 +64,7 @@ namespace { OwningExprResult VisitInitListExpr(InitListExpr *E); OwningExprResult VisitDesignatedInitExpr(DesignatedInitExpr *E); OwningExprResult VisitImplicitValueInitExpr(ImplicitValueInitExpr *E); - // FIXME: ExtVectorElementExpr + OwningExprResult VisitExtVectorElementExpr(ExtVectorElementExpr *E); // FIXME: BlockExpr // FIXME: BlockDeclRefExpr OwningExprResult VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E); @@ -708,6 +708,23 @@ TemplateExprInstantiator::VisitImplicitValueInitExpr( } Sema::OwningExprResult +TemplateExprInstantiator::VisitExtVectorElementExpr(ExtVectorElementExpr *E) { + OwningExprResult Base = Visit(E->getBase()); + if (Base.isInvalid()) + return SemaRef.ExprError(); + + SourceLocation FakeOperatorLoc = + SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); + return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0, + move(Base), + /*FIXME*/FakeOperatorLoc, + tok::period, + E->getAccessorLoc(), + E->getAccessor(), + /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0)); +} + +Sema::OwningExprResult TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { bool isSizeOf = E->isSizeOf(); diff --git a/test/SemaTemplate/instantiate-clang.cpp b/test/SemaTemplate/instantiate-clang.cpp new file mode 100644 index 0000000000..a6c28d9e19 --- /dev/null +++ b/test/SemaTemplate/instantiate-clang.cpp @@ -0,0 +1,35 @@ +// RUN: clang-cc -fsyntax-only -verify %s + +// Test template instantiation for Clang-specific features. + +// --------------------------------------------------------------------- +// Vector types +// --------------------------------------------------------------------- +typedef __attribute__(( ext_vector_type(2) )) double double2; +typedef __attribute__(( ext_vector_type(4) )) double double4; + +template<typename T> +struct ExtVectorAccess0 { + void f(T v1, double4 v2) { + v1.xy = v2.yx; + } +}; + +template struct ExtVectorAccess0<double2>; +template struct ExtVectorAccess0<double4>; + +typedef __attribute__(( ext_vector_type(2) )) double double2; + +template<typename T, typename U, int N, int M> +struct ShuffleVector0 { + void f(T t, U u, double2 a, double2 b) { + (void)__builtin_shufflevector(t, u, N, M); // expected-error{{index}} + (void)__builtin_shufflevector(a, b, N, M); + (void)__builtin_shufflevector(a, b, 2, 1); + } +}; + +template struct ShuffleVector0<double2, double2, 2, 1>; +template struct ShuffleVector0<double2, double2, 4, 3>; // expected-note{{instantiation}} + + diff --git a/test/SemaTemplate/instantiate-expr-3.cpp b/test/SemaTemplate/instantiate-expr-3.cpp index 03386e1873..696b58325c 100644 --- a/test/SemaTemplate/instantiate-expr-3.cpp +++ b/test/SemaTemplate/instantiate-expr-3.cpp @@ -71,23 +71,6 @@ template struct StatementExpr0<int>; template struct StatementExpr0<N1::X>; // expected-note{{instantiation}} // --------------------------------------------------------------------- -// __builtin_shufflevector -// --------------------------------------------------------------------- -typedef __attribute__(( ext_vector_type(2) )) double double2; - -template<typename T, typename U, int N, int M> -struct ShuffleVector0 { - void f(T t, U u, double2 a, double2 b) { - (void)__builtin_shufflevector(t, u, N, M); // expected-error{{index}} - (void)__builtin_shufflevector(a, b, N, M); - (void)__builtin_shufflevector(a, b, 2, 1); - } -}; - -template struct ShuffleVector0<double2, double2, 2, 1>; -template struct ShuffleVector0<double2, double2, 4, 3>; // expected-note{{instantiation}} - -// --------------------------------------------------------------------- // __builtin_choose_expr // --------------------------------------------------------------------- template<bool Cond, typename T, typename U, typename Result> @@ -130,22 +113,3 @@ struct VaArg1 { template struct VaArg1<__builtin_va_list, int>; template struct VaArg1<int, int>; // expected-note{{instantiation}} - -// --------------------------------------------------------------------- -// Vector element expressions -// --------------------------------------------------------------------- -#if 0 -// Not supported until we have full support for MemberExpr. -typedef __attribute__(( ext_vector_type(2) )) double double2; -typedef __attribute__(( ext_vector_type(4) )) double double4; - -template<typename T, typename U> -struct VectorElem0 { - void f(T t, U u) { - t.xy = u.zw; - } -}; - -template struct VectorElem0<double2, double4>; -template struct VectorElem0<double4, double4>; -#endif |