cxx0x-attributes.cpp revision 6ee326af4e77e6f05973486097884d7431f2108d
1// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++11 %s 2 3// Declaration syntax checks 4[[]] int before_attr; 5int [[]] between_attr; 6int after_attr [[]]; 7int * [[]] ptr_attr; 8int & [[]] ref_attr = after_attr; 9int && [[]] rref_attr = 0; 10int array_attr [1] [[]]; 11alignas(8) int aligned_attr; 12[[test::valid(for 42 [very] **** '+' symbols went on a trip; the end.)]] 13 int garbage_attr; 14void fn_attr () [[]]; 15void noexcept_fn_attr () noexcept [[]]; 16struct MemberFnOrder { 17 virtual void f() const volatile && noexcept [[]] final = 0; 18}; 19class [[]] class_attr {}; 20extern "C++" [[]] int extern_attr; 21template <typename T> [[]] void template_attr (); 22[[]] [[]] int [[]] [[]] multi_attr [[]] [[]]; 23 24int comma_attr [[,]]; // expected-error {{expected identifier}} 25int scope_attr [[foo::]]; // expected-error {{expected identifier}} 26int (paren_attr) [[]]; // expected-error {{an attribute list cannot appear here}} 27unsigned [[]] int attr_in_decl_spec; // expected-error {{expected unqualified-id}} 28class foo { 29 void const_after_attr () [[]] const; // expected-error {{expected ';'}} 30}; 31extern "C++" [[]] { } // expected-error {{an attribute list cannot appear here}} 32[[]] template <typename T> void before_template_attr (); // expected-error {{an attribute list cannot appear here}} 33[[]] namespace ns { int i; } // expected-error {{an attribute list cannot appear here}} expected-note {{declared here}} 34[[]] static_assert(true, ""); //expected-error {{an attribute list cannot appear here}} 35[[]] asm(""); // expected-error {{an attribute list cannot appear here}} 36 37[[]] using ns::i; // expected-error {{an attribute list cannot appear here}} 38[[]] using namespace ns; 39 40// Argument tests 41alignas int aligned_no_params; // expected-error {{expected '('}} 42alignas(i) int aligned_nonconst; // expected-error {{'aligned' attribute requires integer constant}} expected-note {{read of non-const variable 'i'}} 43 44// Statement tests 45void foo () { 46 [[]] ; 47 [[]] { } 48 [[]] if (0) { } 49 [[]] for (;;); 50 [[]] do { 51 [[]] continue; 52 } while (0); 53 [[]] while (0); 54 55 [[]] switch (i) { 56 [[]] case 0: 57 [[]] default: 58 [[]] break; 59 } 60 61 [[]] goto there; 62 [[]] there: 63 64 [[]] try { 65 } [[]] catch (...) { // expected-error {{an attribute list cannot appear here}} 66 } 67 struct S { int arr[2]; } s; 68 (void)s.arr[ [] { return 0; }() ]; // expected-error {{C++11 only allows consecutive left square brackets when introducing an attribute}} 69 int n = __builtin_offsetof(S, arr[ [] { return 0; }() ]); // expected-error {{C++11 only allows consecutive left square brackets when introducing an attribute}} 70 71 [[]] return; 72} 73