temp_class_spec_neg.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. // RUN: %clang_cc1 -fsyntax-only -verify %s
  2. template<typename T> struct vector;
  3. // C++ [temp.class.spec]p6:
  4. namespace N {
  5. namespace M {
  6. template<typename T> struct A; // expected-note{{here}}
  7. }
  8. }
  9. template<typename T>
  10. struct N::M::A<T*> { }; // expected-warning{{C++11 extension}}
  11. // C++ [temp.class.spec]p9
  12. // bullet 1
  13. template <int I, int J> struct A {};
  14. template <int I> struct A<I+5, I*2> {}; // expected-error{{depends on}}
  15. template <int I, int J> struct B {};
  16. template <int I> struct B<I, I> {}; //OK
  17. // bullet 2
  18. template <class T, T t> struct C {}; // expected-note{{declared here}}
  19. template <class T> struct C<T, 1>; // expected-error{{specializes}}
  20. template <class T, T* t> struct C<T*, t>; // okay
  21. template< int X, int (*array_ptr)[X] > class A2 {}; // expected-note{{here}}
  22. int array[5];
  23. template< int X > class A2<X, &array> { }; // expected-error{{specializes}}
  24. template<typename T, int N, template<typename X> class TT>
  25. struct Test0;
  26. // bullet 3
  27. template<typename T, int N, template<typename X> class TT>
  28. struct Test0<T, N, TT>; // expected-error{{does not specialize}}
  29. // C++ [temp.class.spec]p10
  30. template<typename T = int, // expected-error{{default template argument}}
  31. int N = 17, // expected-error{{default template argument}}
  32. template<typename X> class TT = ::vector> // expected-error{{default template argument}}
  33. struct Test0<T*, N, TT> { };
  34. template<typename T> struct Test1;
  35. template<typename T, typename U> // expected-note{{non-deducible}}
  36. struct Test1<T*> { }; // expected-warning{{never be used}}