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  }