1fb8d02b1SAlp Toker // REQUIRES: x86-registered-target
21f79297eSAlex Lorenz // RUN: %clang -target i386-apple-darwin -std=c++11 -fblocks -Wframe-larger-than=70 -Wno-stdlibcxx-not-found -Xclang -verify -o /dev/null -c %s
31f79297eSAlex Lorenz // RUN: %clang -target i386-apple-darwin -std=c++11 -fblocks -Wframe-larger-than=70 -Wno-stdlibcxx-not-found -Xclang -verify -o /dev/null -c %s -DIS_SYSHEADER
4fb8d02b1SAlp Toker 
5fb8d02b1SAlp Toker // Test that:
6fb8d02b1SAlp Toker //  * The driver passes the option through to the backend.
7fb8d02b1SAlp Toker //  * The frontend diagnostic handler 'demangles' and resolves the correct function definition.
8fb8d02b1SAlp Toker 
9e81b42fdSAlp Toker // Test that link invocations don't emit an "argument unused during compilation" diagnostic.
10e81b42fdSAlp Toker // RUN: touch %t.o
1100c5343dSZachary Turner // RUN: %clang -Werror -Wno-msvc-not-found -Wno-liblto -Wframe-larger-than=0 %t.o -###  2>&1 | not grep ' error: '
12e81b42fdSAlp Toker 
13fb8d02b1SAlp Toker // TODO: Support rich backend diagnostics for Objective-C methods.
14fb8d02b1SAlp Toker 
151e58f3aaSAlp Toker // Backend diagnostics aren't suppressed in system headers because such results
161e58f3aaSAlp Toker // are significant and actionable.
171e58f3aaSAlp Toker #ifdef IS_HEADER
181e58f3aaSAlp Toker 
191e58f3aaSAlp Toker #ifdef IS_SYSHEADER
201e58f3aaSAlp Toker #pragma clang system_header
211e58f3aaSAlp Toker #endif
221e58f3aaSAlp Toker 
23fb8d02b1SAlp Toker extern void doIt(char *);
24fb8d02b1SAlp Toker 
frameSizeWarning(int,int)25fb8d02b1SAlp Toker void frameSizeWarning(int, int) {}
26fb8d02b1SAlp Toker 
27fb8d02b1SAlp Toker void frameSizeWarning();
28fb8d02b1SAlp Toker 
frameSizeWarning()29*25682868SArthur Eubanks void frameSizeWarning() { // expected-warning-re {{stack frame size ({{[0-9]+}}) exceeds limit ({{[0-9]+}}) in 'frameSizeWarning()'}}
30fb8d02b1SAlp Toker   char buffer[80];
31fb8d02b1SAlp Toker   doIt(buffer);
32fb8d02b1SAlp Toker }
33fb8d02b1SAlp Toker 
34fb8d02b1SAlp Toker void frameSizeWarning();
35fb8d02b1SAlp Toker 
frameSizeWarning(int)36fb8d02b1SAlp Toker void frameSizeWarning(int) {}
37fb8d02b1SAlp Toker 
38d0847341SAlp Toker #pragma GCC diagnostic push
396aaf4fa2SRichard Smith #pragma GCC diagnostic ignored "-Wframe-larger-than"
frameSizeWarningIgnored()40d0847341SAlp Toker void frameSizeWarningIgnored() {
41d0847341SAlp Toker   char buffer[80];
42d0847341SAlp Toker   doIt(buffer);
43d0847341SAlp Toker }
44d0847341SAlp Toker #pragma GCC diagnostic pop
45d0847341SAlp Toker 
frameSizeLocalClassWarning()46fb8d02b1SAlp Toker void frameSizeLocalClassWarning() {
47fb8d02b1SAlp Toker   struct S {
48*25682868SArthur Eubanks     S() { // expected-warning-re {{stack frame size ({{[0-9]+}}) exceeds limit ({{[0-9]+}}) in 'frameSizeLocalClassWarning()::S::S()'}}
49fb8d02b1SAlp Toker       char buffer[80];
50fb8d02b1SAlp Toker       doIt(buffer);
51fb8d02b1SAlp Toker     }
52fb8d02b1SAlp Toker   };
53fb8d02b1SAlp Toker   S();
54fb8d02b1SAlp Toker }
55fb8d02b1SAlp Toker 
frameSizeLambdaWarning()56fb8d02b1SAlp Toker void frameSizeLambdaWarning() {
57fb8d02b1SAlp Toker   auto fn =
58*25682868SArthur Eubanks       []() { // expected-warning-re {{stack frame size ({{[0-9]+}}) exceeds limit ({{[0-9]+}}) in 'frameSizeLambdaWarning()::$_0::operator()() const'}}
59fb8d02b1SAlp Toker     char buffer[80];
60fb8d02b1SAlp Toker     doIt(buffer);
61fb8d02b1SAlp Toker   };
62fb8d02b1SAlp Toker   fn();
63fb8d02b1SAlp Toker }
64fb8d02b1SAlp Toker 
frameSizeBlocksWarning()65fb8d02b1SAlp Toker void frameSizeBlocksWarning() {
66fb8d02b1SAlp Toker   auto fn =
67*25682868SArthur Eubanks       ^() { // expected-warning-re {{stack frame size ({{[0-9]+}}) exceeds limit ({{[0-9]+}}) in 'invocation function for block in frameSizeBlocksWarning()'}}
68fb8d02b1SAlp Toker     char buffer[80];
69fb8d02b1SAlp Toker     doIt(buffer);
70fb8d02b1SAlp Toker   };
71fb8d02b1SAlp Toker   fn();
72fb8d02b1SAlp Toker }
731e58f3aaSAlp Toker 
741e58f3aaSAlp Toker #else
751e58f3aaSAlp Toker 
761e58f3aaSAlp Toker #define IS_HEADER
771e58f3aaSAlp Toker #include __FILE__
781e58f3aaSAlp Toker #endif
79