| // PR c++/69098 |
| // { dg-do compile { target c++14 } } |
| |
| template<typename> struct SpecPerType; |
| |
| class Specializer |
| { |
| public: |
| template<bool> void MbrFnTempl() //Must be a template |
| { |
| } |
| template<unsigned> struct InnerClassTempl |
| { //Had to be a template whenever I tested for it |
| static void InnerMemberFn(); |
| }; |
| |
| void Trigger() |
| { |
| InnerClassTempl<0u>::InnerMemberFn(); |
| } |
| }; |
| |
| template<> struct SpecPerType<Specializer> |
| { |
| using FnType = void (Specializer::*)(); |
| template<bool P> static constexpr FnType SpecMbrFnPtr = |
| &Specializer::template MbrFnTempl<P>; |
| }; |
| |
| template<bool> constexpr SpecPerType<Specializer>::FnType |
| SpecPerType<Specializer>::SpecMbrFnPtr; //Just a formalism |
| |
| template<unsigned X> void Specializer::InnerClassTempl<X>::InnerMemberFn() |
| { |
| using Spec = SpecPerType<Specializer>; |
| typename Spec::FnType ErrorSite = Spec::template SpecMbrFnPtr<true>; |
| //ErrorSite would get called next in the original code |
| //(this should result in a call to MbrFnTempl) |
| } |
| |
| int main() |
| { |
| } |