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