1 // RUN: %clang_builtins %s %librt -o %t && %run %t 2 // REQUIRES: librt_has_trampoline_setup 3 4 #include <stdio.h> 5 #include <string.h> 6 #include <stdint.h> 7 8 /* 9 * Tests nested functions 10 * The ppc and aarch64 compilers generates a call to __trampoline_setup 11 * The i386 and x86_64 compilers generate a call to ___enable_execute_stack 12 */ 13 14 /* 15 * Note that, nested functions are not ISO C and are not supported in Clang. 16 */ 17 18 #if !defined(__clang__) 19 20 typedef int (*nested_func_t)(int x); 21 22 nested_func_t proc; 23 24 int main() { 25 /* Some locals */ 26 int c = 10; 27 int d = 7; 28 29 /* Define a nested function: */ 30 int bar(int x) { return x*5 + c*d; }; 31 32 /* Assign global to point to nested function 33 * (really points to trampoline). */ 34 proc = bar; 35 36 /* Invoke nested function: */ 37 c = 4; 38 if ( (*proc)(3) != 43 ) 39 return 1; 40 d = 5; 41 if ( (*proc)(4) != 40 ) 42 return 1; 43 44 /* Success. */ 45 return 0; 46 } 47 48 #else 49 50 int main() { 51 printf("skipped\n"); 52 return 0; 53 } 54 55 #endif 56