/cp
[official-gcc.git] / gcc / testsuite / g++.dg / cpp1y / 69098.C
blobafc4294c4dff0b4f65e57d2dec664948880b264b
1 // PR c++/69098
2 // { dg-do compile { target c++14 } }
4 template<typename> struct SpecPerType;
6 class Specializer
8 public:
9     template<bool> void MbrFnTempl() //Must be a template
10         {
11         }
12         template<unsigned> struct InnerClassTempl
13         {  //Had to be a template whenever I tested for it
14                 static void InnerMemberFn();
15         };
17         void Trigger()
18         {
19                 InnerClassTempl<0u>::InnerMemberFn();
20         }
23 template<> struct SpecPerType<Specializer>
25         using FnType = void (Specializer::*)();
26     template<bool P> static constexpr FnType SpecMbrFnPtr =
27         &Specializer::template MbrFnTempl<P>;
30 template<bool> constexpr SpecPerType<Specializer>::FnType
31     SpecPerType<Specializer>::SpecMbrFnPtr; //Just a formalism
33 template<unsigned X> void Specializer::InnerClassTempl<X>::InnerMemberFn()
35         using Spec = SpecPerType<Specializer>;
36         typename Spec::FnType ErrorSite = Spec::template SpecMbrFnPtr<true>;
37     //ErrorSite would get called next in the original code
38     //(this should result in a call to MbrFnTempl)
41 int main()