xref: /llvm-project/clang/test/SemaCXX/attr-optnone.cpp (revision ac77dcd764f42d3635b5974dd954d51227bdcc20)
1f0674350SPaul Robinson // RUN: %clang_cc1 -std=c++11 -fms-compatibility -fsyntax-only -verify %s
2f0674350SPaul Robinson 
3f0674350SPaul Robinson int foo() __attribute__((optnone));
4f0674350SPaul Robinson int bar() __attribute__((optnone)) __attribute__((noinline));
5f0674350SPaul Robinson 
6080b1f30SPaul Robinson int baz() __attribute__((always_inline)) __attribute__((optnone)); // expected-warning{{'always_inline' attribute ignored}} expected-note{{conflicting attribute is here}}
7080b1f30SPaul Robinson int quz() __attribute__((optnone)) __attribute__((always_inline)); // expected-warning{{'always_inline' attribute ignored}} expected-note{{conflicting attribute is here}}
8f0674350SPaul Robinson 
930e41fb4SPaul Robinson __attribute__((always_inline)) int baz1(); // expected-warning{{'always_inline' attribute ignored}}
baz1()1030e41fb4SPaul Robinson __attribute__((optnone)) int baz1() { return 1; } // expected-note{{conflicting attribute is here}}
1130e41fb4SPaul Robinson 
1230e41fb4SPaul Robinson __attribute__((optnone)) int quz1(); // expected-note{{conflicting attribute is here}}
quz1()1330e41fb4SPaul Robinson __attribute__((always_inline)) int quz1() { return 1; } // expected-warning{{'always_inline' attribute ignored}}
1430e41fb4SPaul Robinson 
15080b1f30SPaul Robinson int bay() __attribute__((minsize)) __attribute__((optnone)); // expected-warning{{'minsize' attribute ignored}} expected-note{{conflicting}}
16080b1f30SPaul Robinson int quy() __attribute__((optnone)) __attribute__((minsize)); // expected-warning{{'minsize' attribute ignored}} expected-note{{conflicting}}
17aae2fba5SPaul Robinson 
1830e41fb4SPaul Robinson __attribute__((minsize)) int bay1(); // expected-warning{{'minsize' attribute ignored}}
bay1()1930e41fb4SPaul Robinson __attribute__((optnone)) int bay1() { return 1; } // expected-note{{conflicting attribute is here}}
2030e41fb4SPaul Robinson 
2130e41fb4SPaul Robinson __attribute__((optnone)) int quy1(); // expected-note{{conflicting attribute is here}}
quy1()2230e41fb4SPaul Robinson __attribute__((minsize)) int quy1() { return 1; } // expected-warning{{'minsize' attribute ignored}}
2330e41fb4SPaul Robinson 
2430e41fb4SPaul Robinson __attribute__((always_inline)) // expected-warning{{'always_inline' attribute ignored}}
2530e41fb4SPaul Robinson   __attribute__((minsize)) // expected-warning{{'minsize' attribute ignored}}
2630e41fb4SPaul Robinson void bay2();
2730e41fb4SPaul Robinson __attribute__((optnone)) // expected-note 2 {{conflicting}}
bay2()2830e41fb4SPaul Robinson void bay2() {}
2930e41fb4SPaul Robinson 
30080b1f30SPaul Robinson __forceinline __attribute__((optnone)) int bax(); // expected-warning{{'__forceinline' attribute ignored}} expected-note{{conflicting}}
31080b1f30SPaul Robinson __attribute__((optnone)) __forceinline int qux(); // expected-warning{{'__forceinline' attribute ignored}} expected-note{{conflicting}}
32080b1f30SPaul Robinson 
33080b1f30SPaul Robinson __forceinline int bax2(); // expected-warning{{'__forceinline' attribute ignored}}
bax2()34080b1f30SPaul Robinson __attribute__((optnone)) int bax2() { return 1; } // expected-note{{conflicting}}
35080b1f30SPaul Robinson __attribute__((optnone)) int qux2(); // expected-note{{conflicting}}
qux2()36080b1f30SPaul Robinson __forceinline int qux2() { return 1; } // expected-warning{{'__forceinline' attribute ignored}}
37f0674350SPaul Robinson 
38f0674350SPaul Robinson int globalVar __attribute__((optnone)); // expected-warning{{'optnone' attribute only applies to functions}}
39f0674350SPaul Robinson 
40f0674350SPaul Robinson int fubar(int __attribute__((optnone)), int); // expected-warning{{'optnone' attribute only applies to functions}}
41f0674350SPaul Robinson 
42f0674350SPaul Robinson struct A {
43f0674350SPaul Robinson   int aField __attribute__((optnone));  // expected-warning{{'optnone' attribute only applies to functions}}
44f0674350SPaul Robinson };
45f0674350SPaul Robinson 
46f0674350SPaul Robinson struct B {
47f0674350SPaul Robinson   void foo() __attribute__((optnone));
48f0674350SPaul Robinson   static void bar() __attribute__((optnone));
49f0674350SPaul Robinson };
50f0674350SPaul Robinson 
51f0674350SPaul Robinson // Verify that we can specify the [[clang::optnone]] syntax as well.
52f0674350SPaul Robinson 
53f0674350SPaul Robinson [[clang::optnone]]
54f0674350SPaul Robinson int foo2();
55f0674350SPaul Robinson [[clang::optnone]]
56f0674350SPaul Robinson int bar2() __attribute__((noinline));
57f0674350SPaul Robinson 
58080b1f30SPaul Robinson [[clang::optnone]] // expected-note {{conflicting}}
59080b1f30SPaul Robinson int baz2() __attribute__((always_inline)); // expected-warning{{'always_inline' attribute ignored}}
60f0674350SPaul Robinson 
61f0674350SPaul Robinson [[clang::optnone]] int globalVar2; //expected-warning{{'optnone' attribute only applies to functions}}
62f0674350SPaul Robinson 
63f0674350SPaul Robinson struct A2 {
64f0674350SPaul Robinson   [[clang::optnone]] int aField; // expected-warning{{'optnone' attribute only applies to functions}}
65f0674350SPaul Robinson };
66f0674350SPaul Robinson 
67f0674350SPaul Robinson struct B2 {
68f0674350SPaul Robinson   [[clang::optnone]]
69f0674350SPaul Robinson   void foo();
70f0674350SPaul Robinson   [[clang::optnone]]
71f0674350SPaul Robinson   static void bar();
72f0674350SPaul Robinson };
73f0674350SPaul Robinson 
74c44c1742SAaron Ballman // Verify that we can handle the [[_Clang::optnone]] and
75*ac77dcd7SAaron Ballman // [[__clang__::optnone]] spellings, as well as [[clang::__optnone__]].
76c44c1742SAaron Ballman [[_Clang::optnone]] int foo3();
77c44c1742SAaron Ballman [[__clang__::optnone]] int foo4(); // expected-warning {{'__clang__' is a predefined macro name, not an attribute scope specifier; did you mean '_Clang' instead?}}
78*ac77dcd7SAaron Ballman [[clang::__optnone__]] int foo5();
79*ac77dcd7SAaron Ballman [[_Clang::__optnone__]] int foo6();
80c44c1742SAaron Ballman 
81*ac77dcd7SAaron Ballman [[_Clang::optnone]] int foo7; // expected-warning {{'optnone' attribute only applies to functions}}
82