xref: /llvm-project/clang/test/CodeGen/attr-function-return.cpp (revision 6cee5393371fdde798605c88bad0ebceb3626257)
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 Desaulniers int foo(void) {
122240d72fSNick Desaulniers   // CHECK: @"_ZZ3foovENK3$_0clEv"({{.*}}) [[NOATTR:#[0-9]+]]
132240d72fSNick Desaulniers   return []() {
142240d72fSNick Desaulniers     return 42;
152240d72fSNick Desaulniers   }();
162240d72fSNick Desaulniers }
bar(void)172240d72fSNick Desaulniers int 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 Desaulniers int 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 Desaulniers int 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 Desaulniers extern "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