1 // PR c/81854 - weak alias of an incompatible symbol accepted
3 // { dg-require-ifunc "" } */
4 // { dg-options "-Wextra -Wno-pmf-conversions" }
11 const char* bad_magic ();
13 typedef int (Func)(Klass*);
14 typedef int (Klass::*MemFuncPtr)();
16 static Func* good_resolver ();
17 static void* iffy_resolver ();
18 static MemFuncPtr bad_resolver ();
21 int Klass::implementation (void)
26 // Verify no warning for the expected/compatible declaration.
28 int __attribute__ ((ifunc ("_ZN5Klass13good_resolverEv")))
32 Klass::good_resolver (void)
34 MemFuncPtr mfp = &Klass::implementation;
36 return reinterpret_cast<Func*>(mfp);
40 // Verify a warning for the unsafe declaration.
42 int __attribute__ ((ifunc ("_ZN5Klass13iffy_resolverEv")))
43 Klass::iffy_magic (); // { dg-message "resolver indirect function declared here" }
46 Klass::iffy_resolver (void) // { dg-warning ".ifunc. resolver for .int Klass::iffy_magic\\(\\). should return .int \\(\\*\\)\\(Klass\\*\\)." }
48 MemFuncPtr mfp = &Klass::implementation;
50 return reinterpret_cast<void*>(mfp);
54 // Verify an error for an incompatible declaration.
56 const char* __attribute__ ((ifunc ("_ZN5Klass12bad_resolverEv")))
57 Klass::bad_magic (); // { dg-message "resolver indirect function declared here" }
61 Klass::bad_resolver (void) // { dg-error ".ifunc. resolver for .const char\\* Klass::bad_magic\\(\\). must return .const char\\* \\(\\*\\)\\(Klass\\*\\)." }
63 return &Klass::implementation;