1*67e74705SXin Li // REQUIRES: x86-registered-target 2*67e74705SXin Li // RUN: %clang -target i386-apple-darwin -std=c++11 -fblocks -Wframe-larger-than=70 -Xclang -verify -o /dev/null -c %s 3*67e74705SXin Li // RUN: %clang -target i386-apple-darwin -std=c++11 -fblocks -Wframe-larger-than=70 -Xclang -verify -o /dev/null -c %s -DIS_SYSHEADER 4*67e74705SXin Li 5*67e74705SXin Li // Test that: 6*67e74705SXin Li // * The driver passes the option through to the backend. 7*67e74705SXin Li // * The frontend diagnostic handler 'demangles' and resolves the correct function definition. 8*67e74705SXin Li 9*67e74705SXin Li // Test that link invocations don't emit an "argument unused during compilation" diagnostic. 10*67e74705SXin Li // RUN: touch %t.o 11*67e74705SXin Li // RUN: %clang -Werror -Wframe-larger-than=0 %t.o -### 2>&1 | not grep ' error: ' 12*67e74705SXin Li 13*67e74705SXin Li // TODO: Support rich backend diagnostics for Objective-C methods. 14*67e74705SXin Li 15*67e74705SXin Li // Backend diagnostics aren't suppressed in system headers because such results 16*67e74705SXin Li // are significant and actionable. 17*67e74705SXin Li #ifdef IS_HEADER 18*67e74705SXin Li 19*67e74705SXin Li #ifdef IS_SYSHEADER 20*67e74705SXin Li #pragma clang system_header 21*67e74705SXin Li #endif 22*67e74705SXin Li 23*67e74705SXin Li extern void doIt(char *); 24*67e74705SXin Li frameSizeWarning(int,int)25*67e74705SXin Livoid frameSizeWarning(int, int) {} 26*67e74705SXin Li 27*67e74705SXin Li void frameSizeWarning(); 28*67e74705SXin Li frameSizeWarning()29*67e74705SXin Livoid frameSizeWarning() { // expected-warning-re {{stack frame size of {{[0-9]+}} bytes in function 'frameSizeWarning'}} 30*67e74705SXin Li char buffer[80]; 31*67e74705SXin Li doIt(buffer); 32*67e74705SXin Li } 33*67e74705SXin Li 34*67e74705SXin Li void frameSizeWarning(); 35*67e74705SXin Li frameSizeWarning(int)36*67e74705SXin Livoid frameSizeWarning(int) {} 37*67e74705SXin Li 38*67e74705SXin Li #pragma GCC diagnostic push 39*67e74705SXin Li #pragma GCC diagnostic ignored "-Wframe-larger-than=" frameSizeWarningIgnored()40*67e74705SXin Livoid frameSizeWarningIgnored() { 41*67e74705SXin Li char buffer[80]; 42*67e74705SXin Li doIt(buffer); 43*67e74705SXin Li } 44*67e74705SXin Li #pragma GCC diagnostic pop 45*67e74705SXin Li 46*67e74705SXin Li #pragma GCC diagnostic push 47*67e74705SXin Li #ifndef IS_SYSHEADER 48*67e74705SXin Li // expected-warning@+2 {{unknown warning group '-Wframe-larger-than'}} 49*67e74705SXin Li #endif 50*67e74705SXin Li #pragma GCC diagnostic ignored "-Wframe-larger-than" 51*67e74705SXin Li #pragma GCC diagnostic pop 52*67e74705SXin Li frameSizeLocalClassWarning()53*67e74705SXin Livoid frameSizeLocalClassWarning() { 54*67e74705SXin Li struct S { 55*67e74705SXin Li S() { // expected-warning-re {{stack frame size of {{[0-9]+}} bytes in function 'frameSizeLocalClassWarning()::S::S'}} 56*67e74705SXin Li char buffer[80]; 57*67e74705SXin Li doIt(buffer); 58*67e74705SXin Li } 59*67e74705SXin Li }; 60*67e74705SXin Li S(); 61*67e74705SXin Li } 62*67e74705SXin Li frameSizeLambdaWarning()63*67e74705SXin Livoid frameSizeLambdaWarning() { 64*67e74705SXin Li auto fn = 65*67e74705SXin Li []() { // expected-warning-re {{stack frame size of {{[0-9]+}} bytes in lambda expression}} 66*67e74705SXin Li char buffer[80]; 67*67e74705SXin Li doIt(buffer); 68*67e74705SXin Li }; 69*67e74705SXin Li fn(); 70*67e74705SXin Li } 71*67e74705SXin Li frameSizeBlocksWarning()72*67e74705SXin Livoid frameSizeBlocksWarning() { 73*67e74705SXin Li auto fn = 74*67e74705SXin Li ^() { // expected-warning-re {{stack frame size of {{[0-9]+}} bytes in block literal}} 75*67e74705SXin Li char buffer[80]; 76*67e74705SXin Li doIt(buffer); 77*67e74705SXin Li }; 78*67e74705SXin Li fn(); 79*67e74705SXin Li } 80*67e74705SXin Li 81*67e74705SXin Li #else 82*67e74705SXin Li 83*67e74705SXin Li #define IS_HEADER 84*67e74705SXin Li #include __FILE__ 85*67e74705SXin Li #endif 86