1bb17ff90d9d9a3fac5388304840a3424c04bf2eeAlp Toker// RUN: %clang_cc1 -triple x86_64-unknown-unknown -std=c++11 -verify %s
2d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith
3d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith// Error cases.
4d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith
5d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith[[gnu::this_attribute_does_not_exist]] int unknown_attr;
6d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith// expected-warning@-1 {{unknown attribute 'this_attribute_does_not_exist' ignored}}
7d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smithint [[gnu::unused]] attr_on_type;
8d03de6aaa312d57dcd6e2bc76bed1e89f5c5019dRichard Smith// expected-error@-1 {{'unused' attribute cannot be applied to types}}
9d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smithint *[[gnu::unused]] attr_on_ptr;
10d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith// expected-warning@-1 {{attribute 'unused' ignored, because it cannot be applied to a type}}
11d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith
12d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith// Valid cases.
13d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith
147e66ed34c34efc4acba464a2e7ae10e22abdeb7fRafael Espindolavoid aliasb [[gnu::alias("_Z6alias1v")]] ();
15d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smithvoid alias1() {}
167e66ed34c34efc4acba464a2e7ae10e22abdeb7fRafael Espindolavoid aliasa [[gnu::alias("_Z6alias1v")]] ();
17d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith
18d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith[[gnu::aligned(8)]] int aligned;
19d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smithvoid aligned_fn [[gnu::aligned(32)]] ();
20d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smithstruct [[gnu::aligned(8)]] aligned_struct {};
21d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith
22d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smithvoid always_inline [[gnu::always_inline]] ();
23d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith
24d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith__thread int tls_model [[gnu::tls_model("local-exec")]];
25d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith
26d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smithvoid cleanup(int *p) {
27d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith  int n [[gnu::cleanup(cleanup)]];
28d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith}
29d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith
30d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smithvoid deprecated1 [[gnu::deprecated]] (); // expected-note {{here}}
31d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith[[gnu::deprecated("custom message")]] void deprecated2(); // expected-note {{here}}
32d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smithvoid deprecated3() {
33d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith  deprecated1(); // expected-warning {{deprecated}}
34d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith  deprecated2(); // expected-warning {{custom message}}
35d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith}
36d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith
37d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith[[gnu::naked(1,2,3)]] void naked(); // expected-error {{takes no arguments}}
38d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith
39d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smithvoid nonnull [[gnu::nonnull]] (); // expected-warning {{applied to function with no pointer arguments}}
40d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith
415c52166525f8714c3e3a979b156ec23426947fd3Richard Smith// [[gnu::noreturn]] appertains to a declaration, and marks the innermost
425c52166525f8714c3e3a979b156ec23426947fd3Richard Smith// function declarator in that declaration as being noreturn.
43d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smithint noreturn [[gnu::noreturn]]; // expected-warning {{'noreturn' only applies to function types}}
445c52166525f8714c3e3a979b156ec23426947fd3Richard Smithint noreturn_fn_1();
455c52166525f8714c3e3a979b156ec23426947fd3Richard Smithint noreturn_fn_2() [[gnu::noreturn]]; // expected-warning {{cannot be applied to a type}}
465c52166525f8714c3e3a979b156ec23426947fd3Richard Smithint noreturn_fn_3 [[gnu::noreturn]] ();
475c52166525f8714c3e3a979b156ec23426947fd3Richard Smith[[gnu::noreturn]] int noreturn_fn_4();
485c52166525f8714c3e3a979b156ec23426947fd3Richard Smithint (*noreturn_fn_ptr_1 [[gnu::noreturn]])() = &noreturn_fn_1; // expected-error {{cannot initialize}}
495c52166525f8714c3e3a979b156ec23426947fd3Richard Smithint (*noreturn_fn_ptr_2 [[gnu::noreturn]])() = &noreturn_fn_3;
505c52166525f8714c3e3a979b156ec23426947fd3Richard Smith[[gnu::noreturn]] int (*noreturn_fn_ptr_3)() = &noreturn_fn_1; // expected-error {{cannot initialize}}
515c52166525f8714c3e3a979b156ec23426947fd3Richard Smith[[gnu::noreturn]] int (*noreturn_fn_ptr_4)() = &noreturn_fn_3;
52d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smith
53d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smithstruct [[gnu::packed]] packed { char c; int n; };
54d6e7fae82b857eaeb487ceb591942b8969afdd96Richard Smithstatic_assert(sizeof(packed) == sizeof(char) + sizeof(int), "not packed");
55