issue150.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // RUN: %clang_cc1 -fsyntax-only -verify %s
  2. // expected-no-diagnostics
  3. // Core issue 150: Template template parameters and default arguments
  4. template<typename T, typename U>
  5. struct is_same {
  6. static const bool value = false;
  7. };
  8. template<typename T>
  9. struct is_same<T, T> {
  10. static const bool value = true;
  11. };
  12. namespace PR9353 {
  13. template<class _T, class Traits> class IM;
  14. template <class T, class Trt,
  15. template<class _T, class Traits = int> class IntervalMap>
  16. void foo(IntervalMap<T,Trt>* m) { typedef IntervalMap<int> type; }
  17. void f(IM<int, int>* m) { foo(m); }
  18. }
  19. namespace PR9400 {
  20. template<template <typename T, typename = T > class U> struct A
  21. {
  22. template<int> U<int> foo();
  23. };
  24. template <typename T, typename = T>
  25. struct s {
  26. };
  27. void f() {
  28. A<s> x;
  29. x.foo<2>();
  30. }
  31. }
  32. namespace MultiReplace {
  33. template<typename Z,
  34. template<typename T, typename U = T *, typename V = U const> class TT>
  35. struct X {
  36. typedef TT<Z> type;
  37. };
  38. template<typename T, typename = int, typename = float>
  39. struct Y { };
  40. int check0[is_same<X<int, Y>::type, Y<int, int*, int* const> >::value? 1 : -1];
  41. }
  42. namespace MultiReplacePartial {
  43. template<typename First, typename Z,
  44. template<typename T, typename U = T *, typename V = U const> class TT>
  45. struct X {
  46. typedef TT<Z> type;
  47. };
  48. template<typename Z,
  49. template<typename T, typename U = T *, typename V = U const> class TT>
  50. struct X<int, Z, TT> {
  51. typedef TT<Z> type;
  52. };
  53. template<typename T, typename = int, typename = float>
  54. struct Y { };
  55. int check0[is_same<X<int, int, Y>::type, Y<int, int*, int* const> >::value? 1 : -1];
  56. }
  57. namespace PR9016 {
  58. template<typename > struct allocator ;
  59. template<typename > struct less ;
  60. template<class T, template<class> class Compare, class Default,
  61. template<class> class Alloc>
  62. struct interval_set { };
  63. template <class X, template<class> class = less> struct interval_type_default {
  64. typedef X type;
  65. };
  66. template <class T,
  67. template<class _T, template<class> class Compare = PR9016::less,
  68. class = typename interval_type_default<_T,Compare>::type,
  69. template<class> class = allocator> class IntervalSet>
  70. struct ZZZ
  71. {
  72. IntervalSet<T> IntervalSetT;
  73. };
  74. template <class T,
  75. template<class _T, template<class> class Compare = PR9016::less,
  76. class = typename interval_type_default<_T,Compare>::type,
  77. template<class> class = allocator> class IntervalSet>
  78. void int40()
  79. {
  80. IntervalSet<T> IntervalSetT;
  81. }
  82. void test() {
  83. ZZZ<int, interval_set> zzz;
  84. int40<int, interval_set>();
  85. }
  86. }