diff options
author | Sean Hunt <rideau3@gmail.com> | 2009-11-21 08:43:09 +0000 |
---|---|---|
committer | Sean Hunt <rideau3@gmail.com> | 2009-11-21 08:43:09 +0000 |
commit | bbd37c62e34db3f5a95c899723484a76c71d7757 (patch) | |
tree | 6968f0bb9f714cd41a2035844e46e45d13736a9d /test/Parser/cxx0x-attributes.cpp | |
parent | 7c5c965b876c4c698d22b1e38b6b0b2534036110 (diff) |
Added rudimentary C++0x attribute support.
The following attributes are currently supported in C++0x attribute
lists (and in GNU ones as well):
- align() - semantics believed to be conformant to n3000, except for
redeclarations and what entities it may apply to
- final - semantics believed to be conformant to CWG issue 817's proposed
wording, except for redeclarations
- noreturn - semantics believed to be conformant to n3000, except for
redeclarations
- carries_dependency - currently ignored (this is an optimization hint)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89543 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Parser/cxx0x-attributes.cpp')
-rw-r--r-- | test/Parser/cxx0x-attributes.cpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/test/Parser/cxx0x-attributes.cpp b/test/Parser/cxx0x-attributes.cpp new file mode 100644 index 0000000000..a66e3e0597 --- /dev/null +++ b/test/Parser/cxx0x-attributes.cpp @@ -0,0 +1,61 @@ +// RUN: clang-cc -fsyntax-only -verify -std=c++0x %s + +// Declaration syntax checks +[[]] int before_attr; +int after_attr [[]]; +int * [[]] ptr_attr; +int array_attr [1] [[]]; +[[align(8)]] int aligned_attr; +[[test::valid(for 42 [very] **** '+' symbols went on a trip; the end.)]] + int garbage_attr; +void fn_attr () [[]]; +class [[]] class_attr {}; +extern "C++" [[]] int extern_attr; +template <typename T> [[]] void template_attr (); + +int comma_attr [[,]]; // expected-error {{expected identifier}} +int scope_attr [[foo::]]; // expected-error {{expected identifier}} +int & [[]] ref_attr = after_attr; // expected-error {{an attribute list cannot appear here}} +class foo { + void after_const_attr () const [[]]; // expected-error {{expected expression}} +}; +extern "C++" [[]] { } // expected-error {{an attribute list cannot appear here}} +[[]] template <typename T> void before_template_attr (); // expected-error {{an attribute list cannot appear here}} +[[]] namespace ns { int i; } // expected-error {{an attribute list cannot appear here}} +[[]] static_assert(true, ""); //expected-error {{an attribute list cannot appear here}} +[[]] asm(""); // expected-error {{an attribute list cannot appear here}} + +[[]] using ns::i; // expected-error {{an attribute list cannot appear here}} +[[]] using namespace ns; + +// Argument tests +[[final()]] int final_params; // expected-error {{C++0x attribute 'final' cannot have an argument list}} +[[align]] int aligned_no_params; // expected-error {{C++0x attribute 'align' must have an argument list}} +[[align(i)]] int aligned_nonconst; // expected-error {{'aligned' attribute requires integer constant}} + +// Statement tests +void foo () { + [[]] ; + [[]] { } + [[]] if (0) { } + [[]] for (;;); + [[]] do { + [[]] continue; + } while (0); + [[]] while (0); + + [[]] switch (i) { + [[]] case 0: + [[]] default: + [[]] break; + } + + [[]] goto there; + [[]] there: + + [[]] try { + } [[]] catch (...) { // expected-error {{an attribute list cannot appear here}} + } + + [[]] return; +} |