|  | // XFAIL: target=aarch64-pc-windows-{{.*}} | 
|  | // RUN: %clang_builtins %s %librt -fnested-functions -o %t && %run %t | 
|  | // REQUIRES: librt_has_trampoline_setup | 
|  |  | 
|  | #include <stdio.h> | 
|  | #include <string.h> | 
|  | #include <stdint.h> | 
|  |  | 
|  | /* | 
|  | * Tests nested functions | 
|  | * The ppc compiler generates a call to __trampoline_setup | 
|  | * The i386 and x86_64 compilers generate a call to ___enable_execute_stack | 
|  | */ | 
|  |  | 
|  | /* | 
|  | * Note that, nested functions are not ISO C and are not supported in Clang. | 
|  | */ | 
|  |  | 
|  | #if !defined(__clang__) | 
|  |  | 
|  | typedef int (*nested_func_t)(int x); | 
|  |  | 
|  | nested_func_t proc; | 
|  |  | 
|  | int main() { | 
|  | /* Some locals */ | 
|  | int c = 10; | 
|  | int d = 7; | 
|  |  | 
|  | /* Define a nested function: */ | 
|  | int bar(int x) { return x*5 + c*d; }; | 
|  |  | 
|  | /* Assign global to point to nested function | 
|  | * (really points to trampoline). */ | 
|  | proc = bar; | 
|  |  | 
|  | /* Invoke nested function: */ | 
|  | c = 4; | 
|  | if ( (*proc)(3) != 43 ) | 
|  | return 1; | 
|  | d = 5; | 
|  | if ( (*proc)(4) != 40 ) | 
|  | return 1; | 
|  |  | 
|  | /* Success. */ | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | #else | 
|  |  | 
|  | int main() { | 
|  | printf("skipped\n"); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | #endif |