modernc.org/ccgo/v3@v3.16.14/lib/testdata/bug/dereffp.c (about) 1 void f(int i) {} 2 void g(int i) {} 3 void x(int i) {} 4 5 int h(void (*proc)(int)) { 6 if (proc != *proc) { 7 __builtin_printf("oops\n"); 8 return 255; 9 } 10 11 if (*proc == f) { 12 return 'f'; 13 } 14 15 if (*proc == g) { 16 return 'g'; 17 } 18 19 return 0; 20 } 21 22 int h2(void (**proc)(int)) { 23 if (*proc == f) { 24 return 'f'; 25 } 26 27 if (*proc == g) { 28 return 'g'; 29 } 30 31 return 0; 32 } 33 34 int (**gfpp)(int); 35 int (*gfp)(int); 36 int x2(int i) { return 2*i; } 37 38 int main() { 39 if (h(f) != 'f') { 40 return __LINE__; 41 } 42 43 if (h(&f) != 'f') { 44 return __LINE__; 45 } 46 47 void (*p)(int); 48 void (**q)(int) = &p; 49 p = f; 50 if (h2(q) != 'f') { 51 return __LINE__; 52 } 53 54 p = &f; 55 if (h2(q) != 'f') { 56 return __LINE__; 57 } 58 59 if (h(g) != 'g') { 60 return __LINE__; 61 } 62 63 if (h(&g) != 'g') { 64 return __LINE__; 65 } 66 67 p = g; 68 if (h2(q) != 'g') { 69 return __LINE__; 70 } 71 72 p = &g; 73 if (h2(q) != 'g') { 74 return __LINE__; 75 } 76 77 // ---- 78 79 gfpp = &gfp; 80 gfp = x2; 81 if ((**gfpp)(__LINE__) != 2*__LINE__) { 82 return __LINE__; 83 } 84 85 gfp = &x2; 86 if ((**gfpp)(__LINE__) != 2*__LINE__) { 87 return __LINE__; 88 } 89 90 int (*fp)(int); 91 gfpp = &fp; 92 fp = x2; 93 if ((**gfpp)(__LINE__) != 2*__LINE__) { 94 return __LINE__; 95 } 96 97 int (**fpp)(int) = &gfp; 98 gfp = x2; 99 if ((**fpp)(__LINE__) != 2*__LINE__) { 100 return __LINE__; 101 } 102 103 gfp = &x2; 104 if ((**fpp)(__LINE__) != 2*__LINE__) { 105 return __LINE__; 106 } 107 108 fpp = &fp; 109 fp = x2; 110 if ((**fpp)(__LINE__) != 2*__LINE__) { 111 return __LINE__; 112 } 113 }