https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82657

            Bug ID: 82657
           Summary: when using a template function pointer as a non-type
                    template parameters, the template function will not be
                    defined in some situation
           Product: gcc
           Version: new-ra
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: niqiuha at gmail dot com
  Target Milestone: ---

typedef bool(*func)(int);

//template<typename T = int>
//class TC1{
//  public:
//      static  bool test_func(T t){
//          return true;
//      }
//};

template<typename T=int>
bool test_func(T){
    return true;
}

template< func f = &test_func>
class TC2{
    public:
        TC2(){
            //uncomment the line below ,compile will pass
            //test_func(3);
            f(3);
        }
};

template<typename T = char>
class TC3{
    public:
        TC2<> mc;
        TC3() = default;
};

int main(){
    TC3<> tc3;
    //uncomment the line below ,compile will pass
    //TC2<> mc;
}

This piece of code compile ok  on clang 7.3.0 , But  fail to compile (
https://www.ideone.com/Dd092k )  on gcc 4.8.2, 5.2.0, 6.3 . 

Gcc error information : 
/tmp/ccW3jgBm.o: In function `TC2<&(bool test_func<int>(int))>::TC2()':
tempdef.cpp:(.text._ZN3TC2IXadL_Z9test_funcIiEbT_EEEC2Ev[_ZN3TC2IXadL_Z9test_funcIiEbT_EEEC5Ev]+0x12):
undefined reference to `bool test_func<int>(int)'
collect2: error: ld returned 1 exit status

I did some test , and found:
1. uncomment either line in code with special introduction will make this code
pass compile on gcc
2. change test_func from template function to static function of template
class, the error is same .

Reply via email to