summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/cpp1y/var-templ43.C
blob: 414802fd6c7944cc3d5a6ae1a2f29379be2fc2e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// PR c++/67130
// { dg-do compile { target c++14 } }

namespace std {
template <typename> struct __success_type;
template <typename> void declval();
template <typename> class decay {
public:
  typedef int type;
};
template <typename...> struct common_type;
struct A {
  template <typename, typename _Up>
  static __success_type<typename decay<decltype(declval<_Up>)>::type> _S_test;
};
template <typename _Tp, typename _Up> struct __common_type_impl : A {
  typedef decltype(_S_test<_Tp, _Up>) type;
};
template <typename _Tp, typename _Up>
struct common_type<_Tp, _Up> : __common_type_impl<_Tp, _Up> {};
}
template <typename> struct B { struct _; };
template <typename T> typename B<T>::_ type;
template <template <typename...> class> struct C;
template <template <typename...> class f> C<f> metafunction;
template <typename T> struct B<T>::_ {};
namespace detail {
template <typename> struct _decltype;
}
template <template <typename...> class F> struct C {
  template <typename... T>
  auto operator()(T...)
      -> decltype(type<typename F<detail::_decltype<T>...>::type>);
};
auto common_type = metafunction<std::common_type>(0, 0);