diff options
Diffstat (limited to 'test/Parser/cxx-template-decl.cpp')
-rw-r--r-- | test/Parser/cxx-template-decl.cpp | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/test/Parser/cxx-template-decl.cpp b/test/Parser/cxx-template-decl.cpp index 81269ce25416..8b2b12037b3c 100644 --- a/test/Parser/cxx-template-decl.cpp +++ b/test/Parser/cxx-template-decl.cpp @@ -1,4 +1,8 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -verify %s -fdelayed-template-parsing -DDELAYED_TEMPLATE_PARSING +// RUN: %clang_cc1 -fsyntax-only -verify -std=gnu++1z %s + + // Errors export class foo { }; // expected-error {{expected template}} @@ -21,6 +25,11 @@ template <template X> struct Err1; // expected-error {{expected '<' after 'templ template <template <typename> > struct Err2; // expected-error {{template template parameter requires 'class' after the parameter list}} template <template <typename> Foo> struct Err3; // expected-error {{template template parameter requires 'class' after the parameter list}} +template <template <typename> typename Foo> struct Cxx1z; +#if __cplusplus <= 201402L +// expected-warning@-2 {{extension}} +#endif + // Template function declarations template <typename T> void foo(); template <typename T, typename U> void foo(); @@ -102,7 +111,11 @@ template<template<typename> class T> struct shadow8 { // expected-note{{template template<int Size> void f(int& i) { i = Size; + #ifdef DELAYED_TEMPLATE_PARSING + Size = i; + #else Size = i; // expected-error{{expression is not assignable}} + #endif } template<typename T> @@ -127,3 +140,73 @@ namespace PR6184 { template <typename T> void N::bar(typename T::x) { } } + +// This PR occurred only in template parsing mode. +namespace PR17637 { +template <int> +struct L { + template <typename T> + struct O { + template <typename U> + static void Fun(U); + }; +}; + +template <int k> +template <typename T> +template <typename U> +void L<k>::O<T>::Fun(U) {} + +void Instantiate() { L<0>::O<int>::Fun(0); } + +} + +namespace explicit_partial_specializations { +typedef char (&oneT)[1]; +typedef char (&twoT)[2]; +typedef char (&threeT)[3]; +typedef char (&fourT)[4]; +typedef char (&fiveT)[5]; +typedef char (&sixT)[6]; + +char one[1]; +char two[2]; +char three[3]; +char four[4]; +char five[5]; +char six[6]; + +template<bool b> struct bool_ { typedef int type; }; +template<> struct bool_<false> { }; + +#define XCAT(x,y) x ## y +#define CAT(x,y) XCAT(x,y) +#define sassert(_b_) bool_<(_b_)>::type CAT(var, __LINE__); + + +template <int> +struct L { + template <typename T> + struct O { + template <typename U> + static oneT Fun(U); + + }; +}; +template <int k> +template <typename T> +template <typename U> +oneT L<k>::O<T>::Fun(U) { return one; } + +template<> +template<> +template<typename U> +oneT L<0>::O<char>::Fun(U) { return one; } + + +void Instantiate() { + sassert(sizeof(L<0>::O<int>::Fun(0)) == sizeof(one)); + sassert(sizeof(L<0>::O<char>::Fun(0)) == sizeof(one)); +} + +} |