|  | // RUN: %clang_cc1 < %s -triple i386-mingw32 -fms-extensions -emit-llvm -x c++ | FileCheck %s | 
|  |  | 
|  | // optnone wins over inlinehint. | 
|  | // Test that both func1 and func2 are marked optnone and noinline. | 
|  |  | 
|  | // Definition with both optnone and inlinehint. | 
|  | __attribute__((optnone)) | 
|  | inline int func1(int a) { | 
|  | return a + a + a + a; | 
|  | } | 
|  | // CHECK: @_Z5func1i({{.*}}) [[OPTNONE:#[0-9]+]] | 
|  |  | 
|  | // optnone declaration, inlinehint definition. | 
|  | __attribute__((optnone)) | 
|  | int func2(int a); | 
|  |  | 
|  | inline int func2(int a) { | 
|  | return a + a + a + a; | 
|  | } | 
|  | // CHECK: @_Z5func2i({{.*}}) [[OPTNONE]] | 
|  |  | 
|  | // Keep alive the definitions of func1 and func2. | 
|  | int foo() { | 
|  | int val = func1(1); | 
|  | return val + func2(2); | 
|  | } | 
|  |  | 
|  | // optnone wins over minsize. | 
|  | __attribute__((optnone)) | 
|  | int func3(int a); | 
|  |  | 
|  | __attribute__((minsize)) | 
|  | int func3(int a) { | 
|  | return a + a + a + a; | 
|  | } | 
|  | // Same attribute set as everything else, therefore no 'minsize'. | 
|  | // CHECK: @_Z5func3i({{.*}}) [[OPTNONE]] | 
|  |  | 
|  |  | 
|  | // Verify that noreturn is compatible with optnone. | 
|  | __attribute__((noreturn)) | 
|  | extern void exit_from_function(); | 
|  |  | 
|  | __attribute__((noreturn)) __attribute((optnone)) | 
|  | extern void noreturn_function(int a) { exit_from_function(); } | 
|  | // CHECK: @_Z17noreturn_functioni({{.*}}) [[NORETURN:#[0-9]+]] | 
|  |  | 
|  |  | 
|  | // Verify that __declspec(noinline) is compatible with optnone. | 
|  | __declspec(noinline) __attribute__((optnone)) | 
|  | void func4() { return; } | 
|  | // CHECK: @_Z5func4v() [[OPTNONE]] | 
|  |  | 
|  | __declspec(noinline) | 
|  | extern void func5(); | 
|  |  | 
|  | __attribute__((optnone)) | 
|  | void func5() { return; } | 
|  | // CHECK: @_Z5func5v() [[OPTNONE]] | 
|  |  | 
|  |  | 
|  | // Verify also that optnone can be used on dllexport functions. | 
|  | // Adding attribute optnone on a dllimport function has no effect. | 
|  |  | 
|  | __attribute__((dllimport)) | 
|  | __attribute__((optnone)) | 
|  | int imported_optnone_func(int a); | 
|  |  | 
|  | __attribute__((dllexport)) | 
|  | __attribute__((optnone)) | 
|  | int exported_optnone_func(int a) { | 
|  | return imported_optnone_func(a); // use of imported func | 
|  | } | 
|  | // CHECK: @_Z21exported_optnone_funci({{.*}}) [[OPTNONE]] | 
|  | // CHECK: declare dllimport {{.*}} @_Z21imported_optnone_funci({{.*}}) [[DLLIMPORT:#[0-9]+]] | 
|  |  | 
|  |  | 
|  | // CHECK: attributes [[OPTNONE]] = { noinline {{.*}} optnone | 
|  | // CHECK: attributes [[NORETURN]] = { noinline noreturn {{.*}} optnone | 
|  |  | 
|  | // CHECK: attributes [[DLLIMPORT]] = | 
|  | // CHECK-NOT: optnone |