// 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