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