class-template-decl.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. // RUN: %clang_cc1 -fsyntax-only -verify %s
  2. template<typename T> class A;
  3. extern "C++" {
  4. template<typename T> class B;
  5. }
  6. namespace N {
  7. template<typename T> class C;
  8. }
  9. extern "C" {
  10. template<typename T> class D; // expected-error{{templates must have C++ linkage}}
  11. }
  12. extern "C" {
  13. class PR17968 {
  14. template<typename T> class D; // expected-error{{templates must have C++ linkage}}
  15. template<typename T> void f(); // expected-error{{templates must have C++ linkage}}
  16. };
  17. }
  18. template<class U> class A; // expected-note{{previous template declaration is here}}
  19. template<int N> class A; // expected-error{{template parameter has a different kind in template redeclaration}}
  20. template<int N> class NonTypeTemplateParm;
  21. typedef int INT;
  22. template<INT M> class NonTypeTemplateParm; // expected-note{{previous non-type template parameter with type 'INT' (aka 'int') is here}}
  23. template<long> class NonTypeTemplateParm; // expected-error{{template non-type parameter has a different type 'long' in template redeclaration}}
  24. template<template<typename T> class X> class TemplateTemplateParm;
  25. template<template<class> class Y> class TemplateTemplateParm; // expected-note{{previous template declaration is here}} \
  26. // expected-note{{previous template template parameter is here}}
  27. template<typename> class TemplateTemplateParm; // expected-error{{template parameter has a different kind in template redeclaration}}
  28. template<template<typename T, int> class X> class TemplateTemplateParm; // expected-error{{too many template parameters in template template parameter redeclaration}}
  29. template<typename T>
  30. struct test {}; // expected-note{{previous definition}}
  31. template<typename T>
  32. struct test : T {}; // expected-error{{redefinition}}
  33. class X {
  34. public:
  35. template<typename T> class C;
  36. };
  37. void f() {
  38. template<typename T> class X; // expected-error{{expression}}
  39. }
  40. template<typename T> class X1 var; // expected-warning{{variable templates are a C++14 extension}} \
  41. // expected-error {{variable has incomplete type 'class X1'}} \
  42. // expected-note {{forward declaration of 'X1'}}
  43. namespace M {
  44. }
  45. template<typename T> class M::C3 { }; // expected-error{{out-of-line definition of 'C3' does not match any declaration in namespace 'M'}}
  46. namespace PR8001 {
  47. template<typename T1>
  48. struct Foo {
  49. template<typename T2> class Bar;
  50. typedef Bar<T1> Baz;
  51. template<typename T2>
  52. struct Bar {
  53. Bar() {}
  54. };
  55. };
  56. void pr8001() {
  57. Foo<int>::Baz x;
  58. Foo<int>::Bar<int> y(x);
  59. }
  60. }
  61. namespace rdar9676205 {
  62. template <unsigned, class _Tp> class tuple_element;
  63. template <class _T1, class _T2> class pair;
  64. template <class _T1, class _T2>
  65. class tuple_element<0, pair<_T1, _T2> >
  66. {
  67. template <class _Tp>
  68. struct X
  69. {
  70. template <class _Up, bool = X<_Up>::value>
  71. struct Y
  72. : public X<_Up>,
  73. public Y<_Up>
  74. { };
  75. };
  76. };
  77. }
  78. namespace redecl {
  79. int A; // expected-note {{here}}
  80. template<typename T> struct A; // expected-error {{different kind of symbol}}
  81. int B; // expected-note {{here}}
  82. template<typename T> struct B { // expected-error {{different kind of symbol}}
  83. };
  84. template<typename T> struct F;
  85. template<typename T> struct K;
  86. int G, H; // expected-note {{here}}
  87. struct S {
  88. int C; // expected-note {{here}}
  89. template<typename T> struct C; // expected-error {{different kind of symbol}}
  90. int D; // expected-note {{here}}
  91. template<typename T> struct D { // expected-error {{different kind of symbol}}
  92. };
  93. int E;
  94. template<typename T> friend struct E { // expected-error {{cannot define a type in a friend}}
  95. };
  96. int F;
  97. template<typename T> friend struct F; // ok, redecl::F
  98. template<typename T> struct G; // ok
  99. template<typename T> friend struct H; // expected-error {{different kind of symbol}}
  100. int I, J, K;
  101. struct U {
  102. template<typename T> struct I; // ok
  103. template<typename T> struct J { // ok
  104. };
  105. template<typename T> friend struct K; // ok, redecl::K
  106. };
  107. };
  108. }
  109. extern "C" template <typename T> // expected-error{{templates must have C++ linkage}}
  110. void DontCrashOnThis() {
  111. T &pT = T();
  112. pT;
  113. }