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