1 // RUN: %clang_cc1 -std=c++11 -fms-compatibility -fsyntax-only -verify %s
2 
3 int foo() __attribute__((optnone));
4 int bar() __attribute__((optnone)) __attribute__((noinline));
5 
6 int baz() __attribute__((always_inline)) __attribute__((optnone)); // expected-warning{{'always_inline' attribute ignored}} expected-note{{conflicting attribute is here}}
7 int quz() __attribute__((optnone)) __attribute__((always_inline)); // expected-warning{{'always_inline' attribute ignored}} expected-note{{conflicting attribute is here}}
8 
9 __attribute__((always_inline)) int baz1(); // expected-warning{{'always_inline' attribute ignored}}
baz1()10 __attribute__((optnone)) int baz1() { return 1; } // expected-note{{conflicting attribute is here}}
11 
12 __attribute__((optnone)) int quz1(); // expected-note{{conflicting attribute is here}}
quz1()13 __attribute__((always_inline)) int quz1() { return 1; } // expected-warning{{'always_inline' attribute ignored}}
14 
15 int bay() __attribute__((minsize)) __attribute__((optnone)); // expected-warning{{'minsize' attribute ignored}} expected-note{{conflicting}}
16 int quy() __attribute__((optnone)) __attribute__((minsize)); // expected-warning{{'minsize' attribute ignored}} expected-note{{conflicting}}
17 
18 __attribute__((minsize)) int bay1(); // expected-warning{{'minsize' attribute ignored}}
bay1()19 __attribute__((optnone)) int bay1() { return 1; } // expected-note{{conflicting attribute is here}}
20 
21 __attribute__((optnone)) int quy1(); // expected-note{{conflicting attribute is here}}
quy1()22 __attribute__((minsize)) int quy1() { return 1; } // expected-warning{{'minsize' attribute ignored}}
23 
24 __attribute__((always_inline)) // expected-warning{{'always_inline' attribute ignored}}
25   __attribute__((minsize)) // expected-warning{{'minsize' attribute ignored}}
26 void bay2();
27 __attribute__((optnone)) // expected-note 2 {{conflicting}}
bay2()28 void bay2() {}
29 
30 __forceinline __attribute__((optnone)) int bax(); // expected-warning{{'__forceinline' attribute ignored}} expected-note{{conflicting}}
31 __attribute__((optnone)) __forceinline int qux(); // expected-warning{{'__forceinline' attribute ignored}} expected-note{{conflicting}}
32 
33 __forceinline int bax2(); // expected-warning{{'__forceinline' attribute ignored}}
bax2()34 __attribute__((optnone)) int bax2() { return 1; } // expected-note{{conflicting}}
35 __attribute__((optnone)) int qux2(); // expected-note{{conflicting}}
qux2()36 __forceinline int qux2() { return 1; } // expected-warning{{'__forceinline' attribute ignored}}
37 
38 int globalVar __attribute__((optnone)); // expected-warning{{'optnone' attribute only applies to functions}}
39 
40 int fubar(int __attribute__((optnone)), int); // expected-warning{{'optnone' attribute only applies to functions}}
41 
42 struct A {
43   int aField __attribute__((optnone));  // expected-warning{{'optnone' attribute only applies to functions}}
44 };
45 
46 struct B {
47   void foo() __attribute__((optnone));
48   static void bar() __attribute__((optnone));
49 };
50 
51 // Verify that we can specify the [[clang::optnone]] syntax as well.
52 
53 [[clang::optnone]]
54 int foo2();
55 [[clang::optnone]]
56 int bar2() __attribute__((noinline));
57 
58 [[clang::optnone]] // expected-note {{conflicting}}
59 int baz2() __attribute__((always_inline)); // expected-warning{{'always_inline' attribute ignored}}
60 
61 [[clang::optnone]] int globalVar2; //expected-warning{{'optnone' attribute only applies to functions}}
62 
63 struct A2 {
64   [[clang::optnone]] int aField; // expected-warning{{'optnone' attribute only applies to functions}}
65 };
66 
67 struct B2 {
68   [[clang::optnone]]
69   void foo();
70   [[clang::optnone]]
71   static void bar();
72 };
73 
74 // Verify that we can handle the [[_Clang::optnone]] and
75 // [[__clang__::optnone]] spellings, as well as [[clang::__optnone__]].
76 [[_Clang::optnone]] int foo3();
77 [[__clang__::optnone]] int foo4(); // expected-warning {{'__clang__' is a predefined macro name, not an attribute scope specifier; did you mean '_Clang' instead?}}
78 [[clang::__optnone__]] int foo5();
79 [[_Clang::__optnone__]] int foo6();
80 
81 [[_Clang::optnone]] int foo7; // expected-warning {{'optnone' attribute only applies to functions}}
82