diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-06-17 19:49:00 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-06-17 19:49:00 +0000 |
commit | 6a588dd230c14a364d222d6057bbcf11afbd9ffd (patch) | |
tree | 9c9bf8494aef11114db48de38fc29ea1223242b1 | |
parent | f5216f2fa1e8cd580e22d45fd469bf110ac6373e (diff) |
Diagnose the use of attributes on namespace aliases, from Anis Ahmad
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73626 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/DiagnosticParseKinds.td | 2 | ||||
-rw-r--r-- | lib/Parse/ParseDeclCXX.cpp | 14 | ||||
-rw-r--r-- | test/Parser/namespace-alias-attr.cpp | 8 |
3 files changed, 21 insertions, 3 deletions
diff --git a/include/clang/Basic/DiagnosticParseKinds.td b/include/clang/Basic/DiagnosticParseKinds.td index e2b9eb7a20..ccb59eb51c 100644 --- a/include/clang/Basic/DiagnosticParseKinds.td +++ b/include/clang/Basic/DiagnosticParseKinds.td @@ -108,6 +108,8 @@ def err_expected_semi_after_method_proto : Error< "expected ';' after method prototype">; def err_expected_semi_after_namespace_name : Error< "expected ';' after namespace name">; +def err_unexpected_namespace_attributes_alias : Error< + "attributes can not be specified on namespace alias">; def err_expected_semi_after_attribute_list : Error< "expected ';' after attribute list">; def err_expected_semi_after_static_assert : Error< diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index 498eaf19cd..389ea666f1 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -48,6 +48,8 @@ Parser::DeclPtrTy Parser::ParseNamespace(unsigned Context, SourceLocation IdentLoc; IdentifierInfo *Ident = 0; + + Token attrTok; if (Tok.is(tok::identifier)) { Ident = Tok.getIdentifierInfo(); @@ -56,13 +58,19 @@ Parser::DeclPtrTy Parser::ParseNamespace(unsigned Context, // Read label attributes, if present. Action::AttrTy *AttrList = 0; - if (Tok.is(tok::kw___attribute)) + if (Tok.is(tok::kw___attribute)) { + attrTok = Tok; + // FIXME: save these somewhere. AttrList = ParseAttributes(); + } - if (Tok.is(tok::equal)) - // FIXME: Verify no attributes were present. + if (Tok.is(tok::equal)) { + if (AttrList) + Diag(attrTok, diag::err_unexpected_namespace_attributes_alias); + return ParseNamespaceAlias(NamespaceLoc, IdentLoc, Ident, DeclEnd); + } if (Tok.isNot(tok::l_brace)) { Diag(Tok, Ident ? diag::err_expected_lbrace : diff --git a/test/Parser/namespace-alias-attr.cpp b/test/Parser/namespace-alias-attr.cpp new file mode 100644 index 0000000000..9e4072cde2 --- /dev/null +++ b/test/Parser/namespace-alias-attr.cpp @@ -0,0 +1,8 @@ +// RUN: clang-cc -verify %s + +namespace A +{ +} + +namespace B __attribute__ (( static )) = A; // expected-error{{attributes can not be specified on namespace alias}} + |