<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/75799>75799</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [AMDGPU] Compiling with -x hip causes a linker error with host only function pointer
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:AMDGPU
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          CRobeck
      </td>
    </tr>
</table>

<pre>
    clang++ fptr.cc  works successfully

clang++ -x hip fptr.cc fails with the following linker error:

lld: error: undefined hidden symbol: PrintStr::print_1(char const*)
lld: error: undefined hidden symbol: PrintStr::print_2(char const*)
lld: error: undefined hidden symbol: PrintStr::print_3(char const*)
lld: error: undefined hidden symbol: PrintStr::print_4(char const*)

Expected output:

1 . AA
2 . BB
3 . CC
4 . DD

```
#include <cstdio>

class PrintStr
{
public:
  enum n_funcs_val { n_funcs=5 } ;
  typedef void (PrintStr::*pstr_f_t)( const char* ) ;
  static const pstr_f_t pstr_f[n_funcs] ;

  PrintStr() {}
  ~PrintStr() {}

  void run() ;
  void print_1( char const *str ) ;
  void print_2( char const *str ) ;
  void print_3( char const *str ) ;
  void print_4( char const *str ) ;
} ;


const PrintStr::pstr_f_t (PrintStr::pstr_f)[] = {
  &PrintStr::print_1,
  &PrintStr::print_2,
 &PrintStr::print_3,
  &PrintStr::print_4,
  0,
} ;



void PrintStr::run()
{
  print_1( "AA" ) ;
 print_2( "BB" ) ;
  print_3( "CC" ) ;
  print_4( "DD" ) ;
}

void PrintStr::print_1 ( char const *str )
{
  printf ( "1 . %s\n", str ) ;
}


void PrintStr::print_2 ( char const *str )
{
  printf ( "2 . %s\n", str ) ;
}


void PrintStr::print_3 ( char const *str )
{
  printf ( "3 . %s\n", str ) ;
}


void PrintStr::print_4 ( char const *str )
{
  printf ( "4 . %s\n", str ) ;
}



int main(int argc, char *argv[])
{
  PrintStr *pstr = new PrintStr ;

  pstr->run() ;
 delete (pstr) ;
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0Vk1vo0gT_jXFpRQLqsGYAwcwyXt6pdGu9hxB0za9aXcjukkml_3tK75s4sQ7M1FGstqF6qniqQ-qq7RWHrUQKUQ5RIVX9q4xXbr_w1SCP3mVqV9Trkp9BMqBcjy0rttwjvhiuieLtudcWHvolXoFvwA_m861yd13bGR7tjyUUll8ka5B1wg8GKXMi9RHVFI_iQ5F15kOWLZ2p1QNLDursNe1OEgtamxkXQuN9vVUGTWovnVSuz_d6IFl7fD0GADteFN2yI22DigDSr7EMf0ux-x3OQ5vOp7O---t4E7UaHrX9u6qDgFuMJtlwg3m-SQz3OB-P8khbrAo1law9eff9EhMaq76WiCwPbeulgbY_VX7WHvhP2ni-WVtXynJz8wQhe5PqB8Pveb28blUCHG-PAMrIoS4QGD5gnevrajFAZ-NrBFo9zZPQFlrXfd4eHRDbmg3pQqHrAFlCJSsnVlXOslnzGI4CxDlC41oxWAxPb-XdqPTOIe4WJT__Id2wYwBdL1eIBdWo-bS_HgpOQJl1nXXYawM6FcN2K8ahD9h8KZmb3pjNLnq7SXv76o5F4KSab4hsALPnYQItL0xMPY_gNAFcgPBfuwkXEH8s3wz9OkcE_nW27kHrj4VXPcAEGUZEF0VZlV0IMrz94h1mYFov78JCWdIUbyDXDXvB0HMVPFmc3wc3AHnlw7DCSiyEO010FAf_Kirfiqhc1I-zYW-nAv7NBf25VzCT3MJP8tlOqV2eCrl0OyDWHZHPrgYmQBlZXd8nr7zj5gskeA84cdZoMXLSnE9oQfYHbD7j2ZsLZRwYghsQN2IYLn5vDpldcKS0hNpEPuU-EmQ7Lwm9f2qjvy4inlJpR9vt0FZ86ROkiBKWCBCT6bkEwso2AVhkEThptqGYRTGvE78IN4GFYS-OJVSbZR6Pm1Md_Sktb1I4yhOEk-VlVB23O6IqpI_CT3sD9n_i_99-2uoQFR4XTqY3lX90ULoK2mdvThz0qlxO5xNogL35tRKNaxs4xY373e87K2wWL7Z4yZEY6xDo9UrDpehk0Zja6R2ovP6TqWNc60db94HoIejdE1fbbg5AT0MNOa_u7YzfwvugB7GAC3QwxjjvwEAAP__0ysMFQ">