p11-0x.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
  2. // If a template-parameter of a class template or alias template has a default
  3. // template-argument, each subsequent template-parameter shall either have a
  4. // default template-argument supplied or be a template parameter pack.
  5. template<typename> struct vector;
  6. template<typename T = int, typename> struct X3t; // expected-error{{template parameter missing a default argument}} expected-note{{previous default template argument defined here}}
  7. template<typename T = int, typename> using A3t = int; // expected-error{{template parameter missing a default argument}} expected-note{{previous default template argument defined here}}
  8. template<int V = 0, int> struct X3nt; // expected-error{{template parameter missing a default argument}} expected-note{{previous default template argument defined here}}
  9. template<int V = 0, int> using A3nt = int; // expected-error{{template parameter missing a default argument}} expected-note{{previous default template argument defined here}}
  10. template<template<class> class M = vector, template<class> class> struct X3tt; // expected-error{{template parameter missing a default argument}} expected-note{{previous default template argument defined here}}
  11. template<template<class> class M = vector, template<class> class> using A3tt = int; // expected-error{{template parameter missing a default argument}} expected-note{{previous default template argument defined here}}
  12. template<typename T = int, typename ...Types> struct X2t;
  13. template<typename T = int, typename ...Types> using A2t = X2t<T, Types...>;
  14. template<int V = 0, int ...Values> struct X2nt;
  15. template<int V = 0, int ...Values> using A2nt = X2nt<V, Values...>;
  16. template<template<class> class M = vector, template<class> class... Metas>
  17. struct X2tt;
  18. template<template<class> class M = vector, template<class> class... Metas>
  19. using A2tt = X2tt<M, Metas...>;
  20. // If a template-parameter of a primary class template or alias template is a
  21. // template parameter pack, it shall be the last template-parameter.
  22. template<typename ...Types, // expected-error{{template parameter pack must be the last template parameter}}
  23. int After, int After2>
  24. struct X0t;
  25. X0t<int> pr9789();
  26. template<typename ...Types, // expected-error{{template parameter pack must be the last template parameter}}
  27. int After>
  28. using A0t = int;
  29. template<int ...Values, // expected-error{{template parameter pack must be the last template parameter}}
  30. int After>
  31. struct X0nt;
  32. template<int ...Values, // expected-error{{template parameter pack must be the last template parameter}}
  33. int After>
  34. using A0nt = int;
  35. template<template<typename> class ...Templates, // expected-error{{template parameter pack must be the last template parameter}}
  36. int After>
  37. struct X0tt;
  38. template<template<typename> class ...Templates, // expected-error{{template parameter pack must be the last template parameter}}
  39. int After>
  40. using A0tt = int;
  41. // [ Note: These are not requirements for function templates or class
  42. // template partial specializations because template arguments can be
  43. // deduced (14.8.2). -- end note]
  44. template<typename... Types> struct X1t;
  45. template<typename ...Types, typename T> struct X1t<T, Types...> { };
  46. template<int... Values> struct X1nt;
  47. template<int ...Values, int V> struct X1nt<V, Values...> { };
  48. template<template<int> class... Meta> struct X1tt;
  49. template<template<int> class... Meta, template<int> class M>
  50. struct X1tt<M, Meta...> { };
  51. template<typename ...Types, typename T>
  52. void f1t(X1t<T, Types...>);
  53. template<int ...Values, int V>
  54. void f1nt(X1nt<V, Values...>);
  55. template<template<int> class... Meta, template<int> class M>
  56. void f1tt(X1tt<M, Meta...>);
  57. namespace DefaultTemplateArgsInFunction {
  58. template<typename T = int, typename U> T &f0(U) { T *x = 0; return *x; }
  59. void test_f0() {
  60. int &ir0 = f0(3.14159);
  61. int &ir1 = f0<int>(3.14159);
  62. float &fr0 = f0<float>(3.14159);
  63. }
  64. template<> int &f0(int*);
  65. template int &f0(double&);
  66. }