// RUN: %clang_cc1 -emit-llvm %s -triple x86_64-unknown-linux-gnu -o - -DTEST_ATTR | FileCheck %s --check-prefixes=OBJC,OBJC-ATTR // RUN: %clang_cc1 -emit-llvm %s -triple x86_64-unknown-linux-gnu -o - -mno-outline | FileCheck %s --check-prefixes=OBJC,OBJC-ARG // RUN: %clang_cc1 -emit-llvm %s -triple x86_64-unknown-linux-gnu -o - | FileCheck %s --check-prefixes=OBJC,OBJC-NONE // RUN: %clang_cc1 -emit-llvm -x objective-c++ %s -triple x86_64-unknown-linux-gnu -o - -DTEST_ATTR | FileCheck %s --check-prefixes=OBJCXX,OBJCXX-ATTR // RUN: %clang_cc1 -emit-llvm -x objective-c++ %s -triple x86_64-unknown-linux-gnu -o - -mno-outline | FileCheck %s --check-prefixes=OBJCXX,OBJCXX-ARG // RUN: %clang_cc1 -emit-llvm -x objective-c++ %s -triple x86_64-unknown-linux-gnu -o - | FileCheck %s --check-prefixes=OBJCXX,OBJCXX-NONE // This test checks that: // - [[clang::no_outline]] adds the nooutline IR attribute to specific definitions // - `-mno-outline` adds the nooutline IR attribute to all definitions // - Lack of either does not add nooutline IR attribute #ifdef TEST_ATTR #define ATTR [[clang::no_outline]] #else #define ATTR #endif @interface Test - (int)method:(int)x; - (int)method_no_attr:(int)x; + (int)static_method:(int)x; + (int)static_method_no_attr:(int)x; @end @implementation Test // OBJC-LABEL: define internal i32 @"\01-[Test method:]"( // OBJC: ) #[[ATTR0:[0-9]+]] { // OBJCXX-LABEL: define internal noundef i32 @"\01-[Test method:]"( // OBJCXX: ) #[[ATTR0:[0-9]+]] { - (int)method:(int)x ATTR { return x; } // OBJC-LABEL: define internal i32 @"\01-[Test method_no_attr:]"( // OBJC-ATTR: ) #[[ATTR1:[0-9]+]] { // OBJC-ARG: ) #[[ATTR0]] { // OBJC-NONE: ) #[[ATTR0]] { // OBJCXX-LABEL: define internal noundef i32 @"\01-[Test method_no_attr:]"( // OBJCXX-ATTR: ) #[[ATTR1:[0-9]+]] { // OBJCXX-ARG: ) #[[ATTR0]] { // OBJCXX-NONE: ) #[[ATTR0]] { - (int)method_no_attr:(int) x { return x; } // OBJC-LABEL: define internal i32 @"\01+[Test static_method:]"( // OBJC: ) #[[ATTR0]] { // OBJCXX-LABEL: define internal noundef i32 @"\01+[Test static_method:]"( // OBJCXX: ) #[[ATTR0]] { + (int)static_method:(int)x ATTR { return x; } // OBJC-LABEL: define internal i32 @"\01+[Test static_method_no_attr:]"( // OBJC-ATTR: ) #[[ATTR1]] { // OBJC-ARG: ) #[[ATTR0]] { // OBJC-NONE: ) #[[ATTR0]] { // OBJCXX-LABEL: define internal noundef i32 @"\01+[Test static_method_no_attr:]"( // OBJCXX-ATTR: ) #[[ATTR1]] { // OBJCXX-ARG: ) #[[ATTR0]] { // OBJCXX-NONE: ) #[[ATTR0]] { + (int)static_method_no_attr:(int)x { return x; } @end // OBJC: attributes #[[ATTR0]] = { // OBJC-ATTR-SAME: nooutline // OBJC-ARG-SAME: nooutline // OBJC-NONE-NOT: nooutline // OBJC-SAME: } // OBJC-ATTR: attributes #[[ATTR1]] = { // OBJC-ATTR-NOT: nooutline // OBJC-ATTR-SAME: } // OBJCXX: attributes #[[ATTR0]] = { // OBJCXX-ATTR-SAME: nooutline // OBJCXX-ARG-SAME: nooutline // OBJCXX-NONE-NOT: nooutline // OBJCXX-SAME: } // OBJCXX-ATTR: attributes #[[ATTR1]] = { // OBJCXX-ATTR-NOT: nooutline // OBJCXX-ATTR-SAME: }