cxx0x-attributes.cpp revision bbd37c62e34db3f5a95c899723484a76c71d7757
1bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt// RUN: clang-cc -fsyntax-only -verify -std=c++0x %s 2bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 3bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt// Declaration syntax checks 4bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt[[]] int before_attr; 5bbd37c62e34db3f5a95c899723484a76c71d7757Sean Huntint after_attr [[]]; 6bbd37c62e34db3f5a95c899723484a76c71d7757Sean Huntint * [[]] ptr_attr; 7bbd37c62e34db3f5a95c899723484a76c71d7757Sean Huntint array_attr [1] [[]]; 8bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt[[align(8)]] int aligned_attr; 9bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt[[test::valid(for 42 [very] **** '+' symbols went on a trip; the end.)]] 10bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt int garbage_attr; 11bbd37c62e34db3f5a95c899723484a76c71d7757Sean Huntvoid fn_attr () [[]]; 12bbd37c62e34db3f5a95c899723484a76c71d7757Sean Huntclass [[]] class_attr {}; 13bbd37c62e34db3f5a95c899723484a76c71d7757Sean Huntextern "C++" [[]] int extern_attr; 14bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunttemplate <typename T> [[]] void template_attr (); 15bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 16bbd37c62e34db3f5a95c899723484a76c71d7757Sean Huntint comma_attr [[,]]; // expected-error {{expected identifier}} 17bbd37c62e34db3f5a95c899723484a76c71d7757Sean Huntint scope_attr [[foo::]]; // expected-error {{expected identifier}} 18bbd37c62e34db3f5a95c899723484a76c71d7757Sean Huntint & [[]] ref_attr = after_attr; // expected-error {{an attribute list cannot appear here}} 19bbd37c62e34db3f5a95c899723484a76c71d7757Sean Huntclass foo { 20bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt void after_const_attr () const [[]]; // expected-error {{expected expression}} 21bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt}; 22bbd37c62e34db3f5a95c899723484a76c71d7757Sean Huntextern "C++" [[]] { } // expected-error {{an attribute list cannot appear here}} 23bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt[[]] template <typename T> void before_template_attr (); // expected-error {{an attribute list cannot appear here}} 24bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt[[]] namespace ns { int i; } // expected-error {{an attribute list cannot appear here}} 25bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt[[]] static_assert(true, ""); //expected-error {{an attribute list cannot appear here}} 26bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt[[]] asm(""); // expected-error {{an attribute list cannot appear here}} 27bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 28bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt[[]] using ns::i; // expected-error {{an attribute list cannot appear here}} 29bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt[[]] using namespace ns; 30bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 31bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt// Argument tests 32bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt[[final()]] int final_params; // expected-error {{C++0x attribute 'final' cannot have an argument list}} 33bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt[[align]] int aligned_no_params; // expected-error {{C++0x attribute 'align' must have an argument list}} 34bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt[[align(i)]] int aligned_nonconst; // expected-error {{'aligned' attribute requires integer constant}} 35bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 36bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt// Statement tests 37bbd37c62e34db3f5a95c899723484a76c71d7757Sean Huntvoid foo () { 38bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt [[]] ; 39bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt [[]] { } 40bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt [[]] if (0) { } 41bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt [[]] for (;;); 42bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt [[]] do { 43bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt [[]] continue; 44bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt } while (0); 45bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt [[]] while (0); 46bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 47bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt [[]] switch (i) { 48bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt [[]] case 0: 49bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt [[]] default: 50bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt [[]] break; 51bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt } 52bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 53bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt [[]] goto there; 54bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt [[]] there: 55bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 56bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt [[]] try { 57bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt } [[]] catch (...) { // expected-error {{an attribute list cannot appear here}} 58bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt } 59bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt 60bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt [[]] return; 61bbd37c62e34db3f5a95c899723484a76c71d7757Sean Hunt} 62