12240d72fSNick Desaulniers // RUN: %clang_cc1 -triple x86_64-linux-gnu %s -emit-llvm -o - \ 2d2792e7dSNick Desaulniers // RUN: -Werror=unknown-attributes \ 32240d72fSNick Desaulniers // RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-NOM 42240d72fSNick Desaulniers // RUN: %clang_cc1 -triple x86_64-linux-gnu %s -emit-llvm -o - \ 5d2792e7dSNick Desaulniers // RUN: -Werror=unknown-attributes -mfunction-return=keep \ 6d2792e7dSNick Desaulniers // RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-KEEP 72240d72fSNick Desaulniers // RUN: %clang_cc1 -triple x86_64-linux-gnu %s -emit-llvm -o - \ 8d2792e7dSNick Desaulniers // RUN: -Werror=unknown-attributes -mfunction-return=thunk-extern \ 9d2792e7dSNick Desaulniers // RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-EXTERN 102240d72fSNick Desaulniers foo(void)112240d72fSNick Desaulniersint foo(void) { 122240d72fSNick Desaulniers // CHECK: @"_ZZ3foovENK3$_0clEv"({{.*}}) [[NOATTR:#[0-9]+]] 132240d72fSNick Desaulniers return []() { 142240d72fSNick Desaulniers return 42; 152240d72fSNick Desaulniers }(); 162240d72fSNick Desaulniers } bar(void)172240d72fSNick Desaulniersint bar(void) { 18*6cee5393SRong Xu // CHECK: @"_ZZ3barvENK3$_0clEv"({{.*}}) [[EXTERN:#[0-9]+]] 192240d72fSNick Desaulniers return []() __attribute__((function_return("thunk-extern"))) { 202240d72fSNick Desaulniers return 42; 212240d72fSNick Desaulniers } 222240d72fSNick Desaulniers (); 232240d72fSNick Desaulniers } baz(void)242240d72fSNick Desaulniersint baz(void) { 25*6cee5393SRong Xu // CHECK: @"_ZZ3bazvENK3$_0clEv"({{.*}}) [[KEEP:#[0-9]+]] 262240d72fSNick Desaulniers return []() __attribute__((function_return("keep"))) { 272240d72fSNick Desaulniers return 42; 282240d72fSNick Desaulniers } 292240d72fSNick Desaulniers (); 302240d72fSNick Desaulniers } 312240d72fSNick Desaulniers 322240d72fSNick Desaulniers class Foo { 332240d72fSNick Desaulniers public: 342240d72fSNick Desaulniers // CHECK: @_ZN3Foo3fooEv({{.*}}) [[EXTERN]] foo()352240d72fSNick Desaulniers __attribute__((function_return("thunk-extern"))) int foo() { return 42; } 362240d72fSNick Desaulniers }; 372240d72fSNick Desaulniers quux()382240d72fSNick Desaulniersint quux() { 392240d72fSNick Desaulniers Foo my_foo; 402240d72fSNick Desaulniers return my_foo.foo(); 412240d72fSNick Desaulniers } 422240d72fSNick Desaulniers 432240d72fSNick Desaulniers // CHECK: @extern_c() [[EXTERN]] extern_c()442240d72fSNick Desaulniersextern "C" __attribute__((function_return("thunk-extern"))) void extern_c() {} 452240d72fSNick Desaulniers extern "C" { 462240d72fSNick Desaulniers // CHECK: @extern_c2() [[EXTERN]] extern_c2()472240d72fSNick Desaulniers__attribute__((function_return("thunk-extern"))) void extern_c2() {} 482240d72fSNick Desaulniers } 492240d72fSNick Desaulniers 502240d72fSNick Desaulniers // CHECK-NOM-NOT: [[NOATTR]] = {{.*}}fn_ret_thunk_extern 512240d72fSNick Desaulniers // CHECK-KEEP-NOT: [[NOATTR]] = {{.*}}fn_ret_thunk_extern 522240d72fSNick Desaulniers // CHECK-KEEP-NOT: [[KEEP]] = {{.*}}fn_ret_thunk_extern 532240d72fSNick Desaulniers // CHECK-EXTERN: [[EXTERN]] = {{.*}}fn_ret_thunk_extern 54