1*fb8d02b1SAlp Toker // REQUIRES: x86-registered-target
2*fb8d02b1SAlp Toker // RUN: %clang -target i386-apple-darwin -std=c++11 -fblocks -Wframe-larger-than=70 -Xclang -verify -o /dev/null -c %s
3*fb8d02b1SAlp Toker 
4*fb8d02b1SAlp Toker // Test that:
5*fb8d02b1SAlp Toker //  * The driver passes the option through to the backend.
6*fb8d02b1SAlp Toker //  * The frontend diagnostic handler 'demangles' and resolves the correct function definition.
7*fb8d02b1SAlp Toker 
8*fb8d02b1SAlp Toker // TODO: Support rich backend diagnostics for Objective-C methods.
9*fb8d02b1SAlp Toker 
10*fb8d02b1SAlp Toker extern void doIt(char *);
11*fb8d02b1SAlp Toker 
12*fb8d02b1SAlp Toker void frameSizeWarning(int, int) {}
13*fb8d02b1SAlp Toker 
14*fb8d02b1SAlp Toker void frameSizeWarning();
15*fb8d02b1SAlp Toker 
16*fb8d02b1SAlp Toker void frameSizeWarning() { // expected-warning-re {{stack frame size of {{[0-9]+}} bytes in function 'frameSizeWarning'}}
17*fb8d02b1SAlp Toker   char buffer[80];
18*fb8d02b1SAlp Toker   doIt(buffer);
19*fb8d02b1SAlp Toker }
20*fb8d02b1SAlp Toker 
21*fb8d02b1SAlp Toker void frameSizeWarning();
22*fb8d02b1SAlp Toker 
23*fb8d02b1SAlp Toker void frameSizeWarning(int) {}
24*fb8d02b1SAlp Toker 
25*fb8d02b1SAlp Toker void frameSizeLocalClassWarning() {
26*fb8d02b1SAlp Toker   struct S {
27*fb8d02b1SAlp Toker     S() { // expected-warning-re {{stack frame size of {{[0-9]+}} bytes in function 'frameSizeLocalClassWarning()::S::S'}}
28*fb8d02b1SAlp Toker       char buffer[80];
29*fb8d02b1SAlp Toker       doIt(buffer);
30*fb8d02b1SAlp Toker     }
31*fb8d02b1SAlp Toker   };
32*fb8d02b1SAlp Toker   S();
33*fb8d02b1SAlp Toker }
34*fb8d02b1SAlp Toker 
35*fb8d02b1SAlp Toker void frameSizeLambdaWarning() {
36*fb8d02b1SAlp Toker   auto fn =
37*fb8d02b1SAlp Toker       []() { // expected-warning-re {{stack frame size of {{[0-9]+}} bytes in lambda expression}}
38*fb8d02b1SAlp Toker     char buffer[80];
39*fb8d02b1SAlp Toker     doIt(buffer);
40*fb8d02b1SAlp Toker   };
41*fb8d02b1SAlp Toker   fn();
42*fb8d02b1SAlp Toker }
43*fb8d02b1SAlp Toker 
44*fb8d02b1SAlp Toker void frameSizeBlocksWarning() {
45*fb8d02b1SAlp Toker   auto fn =
46*fb8d02b1SAlp Toker       ^() { // expected-warning-re {{stack frame size of {{[0-9]+}} bytes in block literal}}
47*fb8d02b1SAlp Toker     char buffer[80];
48*fb8d02b1SAlp Toker     doIt(buffer);
49*fb8d02b1SAlp Toker   };
50*fb8d02b1SAlp Toker   fn();
51*fb8d02b1SAlp Toker }
52