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