xref: /aosp_15_r20/external/clang/test/Misc/backend-stack-frame-diagnostics.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li void frameSizeWarning(int, int) {}
26*67e74705SXin Li 
27*67e74705SXin Li void frameSizeWarning();
28*67e74705SXin Li 
frameSizeWarning()29*67e74705SXin Li void 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 Li void 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 Li void 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 Li void 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 Li void 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 Li void 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