diff options
author | Anders Carlsson <andersca@mac.com> | 2011-01-16 23:56:42 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2011-01-16 23:56:42 +0000 |
commit | 11fdbbc1adf695ec4e45e5861dc256a18cde80f6 (patch) | |
tree | b7bc7c09fe6782df5104dc83192d4ea1223bfc75 /clang/lib/Parse/ParseDeclCXX.cpp | |
parent | 5ce56081c78dcbef08a4d89636d292709d9bdb2d (diff) | |
download | bcm5719-llvm-11fdbbc1adf695ec4e45e5861dc256a18cde80f6.tar.gz bcm5719-llvm-11fdbbc1adf695ec4e45e5861dc256a18cde80f6.zip |
Begin work on supporting "N3206: Override control: Eliminating Attributes", from
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3206.htm
This lands support for parsing virt-specifier-seq after member functions, including the
contextual keywords 'final', and 'override'. The keywords are not yet used for anything.
llvm-svn: 123606
Diffstat (limited to 'clang/lib/Parse/ParseDeclCXX.cpp')
-rw-r--r-- | clang/lib/Parse/ParseDeclCXX.cpp | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp index a5cdaa86748..960a9fab688 100644 --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/lib/Parse/ParseDeclCXX.cpp @@ -1261,6 +1261,39 @@ void Parser::HandleMemberFunctionDefaultArgs(Declarator& DeclaratorInfo, } } +/// isCXX0XVirtSpecifier - Determine whether the next token is a C++0x +/// virt-specifier. +/// +/// virt-specifier: +/// override +/// final +/// new +bool Parser::isCXX0XVirtSpecifier() const { + if (Tok.is(tok::kw_new)) + return true; + + if (Tok.isNot(tok::identifier)) + return false; + + const IdentifierInfo *II = Tok.getIdentifierInfo(); + return II == Ident_override || II == Ident_final; +} + +/// ParseOptionalCXX0XVirtSpecifierSeq - Parse a virt-specifier-seq. +/// +/// virt-specifier-seq: +/// virt-specifier +/// virt-specifier-seq virt-specifier +void Parser::ParseOptionalCXX0XVirtSpecifierSeq() { + if (!getLang().CPlusPlus0x) + return; + + while (isCXX0XVirtSpecifier()) { + // FIXME: Actually do something with the specifier. + ConsumeToken(); + } +} + /// ParseCXXClassMemberDeclaration - Parse a C++ class member declaration. /// /// member-declaration: @@ -1277,10 +1310,19 @@ void Parser::HandleMemberFunctionDefaultArgs(Declarator& DeclaratorInfo, /// member-declarator-list ',' member-declarator /// /// member-declarator: -/// declarator pure-specifier[opt] +/// declarator virt-specifier-seq[opt] pure-specifier[opt] /// declarator constant-initializer[opt] /// identifier[opt] ':' constant-expression /// +/// virt-specifier-seq: +/// virt-specifier +/// virt-specifier-seq virt-specifier +/// +/// virt-specifier: +/// override +/// final +/// new +/// /// pure-specifier: /// '= 0' /// @@ -1470,6 +1512,8 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS, SkipUntil(tok::comma, true, true); } + ParseOptionalCXX0XVirtSpecifierSeq(); + // pure-specifier: // '= 0' // |