| // RUN: %clang_cc1 -triple x86_64-linux-gnu %s -emit-llvm -o - \ |
| // RUN: -Werror=unknown-attributes \ |
| // RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-NOM |
| // RUN: %clang_cc1 -triple x86_64-linux-gnu %s -emit-llvm -o - \ |
| // RUN: -Werror=unknown-attributes -mfunction-return=keep \ |
| // RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-KEEP |
| // RUN: %clang_cc1 -triple x86_64-linux-gnu %s -emit-llvm -o - \ |
| // RUN: -Werror=unknown-attributes -mfunction-return=thunk-extern \ |
| // RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-EXTERN |
| |
| int foo(void) { |
| // CHECK: @"_ZZ3foovENK3$_0clEv"({{.*}}) [[NOATTR:#[0-9]+]] |
| return []() { |
| return 42; |
| }(); |
| } |
| int bar(void) { |
| // CHECK: @"_ZZ3barvENK3$_0clEv"({{.*}}) [[EXTERN:#[0-9]+]] |
| return []() __attribute__((function_return("thunk-extern"))) { |
| return 42; |
| } |
| (); |
| } |
| int baz(void) { |
| // CHECK: @"_ZZ3bazvENK3$_0clEv"({{.*}}) [[KEEP:#[0-9]+]] |
| return []() __attribute__((function_return("keep"))) { |
| return 42; |
| } |
| (); |
| } |
| |
| class Foo { |
| public: |
| // CHECK: @_ZN3Foo3fooEv({{.*}}) [[EXTERN]] |
| __attribute__((function_return("thunk-extern"))) int foo() { return 42; } |
| }; |
| |
| int quux() { |
| Foo my_foo; |
| return my_foo.foo(); |
| } |
| |
| // CHECK: @extern_c() [[EXTERN]] |
| extern "C" __attribute__((function_return("thunk-extern"))) void extern_c() {} |
| extern "C" { |
| // CHECK: @extern_c2() [[EXTERN]] |
| __attribute__((function_return("thunk-extern"))) void extern_c2() {} |
| } |
| |
| // CHECK-NOM-NOT: [[NOATTR]] = {{.*}}fn_ret_thunk_extern |
| // CHECK-KEEP-NOT: [[NOATTR]] = {{.*}}fn_ret_thunk_extern |
| // CHECK-KEEP-NOT: [[KEEP]] = {{.*}}fn_ret_thunk_extern |
| // CHECK-EXTERN: [[EXTERN]] = {{.*}}fn_ret_thunk_extern |