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