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