[cfe-commits] r123606 - in /cfe/trunk: include/clang/Parse/Parser.h lib/Parse/ParseDeclCXX.cpp lib/Parse/Parser.cpp test/Parser/cxx0x-override-control-keywords.cpp
Anders Carlsson
andersca at mac.com
Sun Jan 16 15:56:42 PST 2011
Author: andersca
Date: Sun Jan 16 17:56:42 2011
New Revision: 123606
URL: http://llvm.org/viewvc/llvm-project?rev=123606&view=rev
Log:
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.
Added:
cfe/trunk/test/Parser/cxx0x-override-control-keywords.cpp
Modified:
cfe/trunk/include/clang/Parse/Parser.h
cfe/trunk/lib/Parse/ParseDeclCXX.cpp
cfe/trunk/lib/Parse/Parser.cpp
Modified: cfe/trunk/include/clang/Parse/Parser.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=123606&r1=123605&r2=123606&view=diff
==============================================================================
--- cfe/trunk/include/clang/Parse/Parser.h (original)
+++ cfe/trunk/include/clang/Parse/Parser.h Sun Jan 16 17:56:42 2011
@@ -112,6 +112,10 @@
IdentifierInfo *Ident_vector;
IdentifierInfo *Ident_pixel;
+ /// C++0x contextual keywords.
+ IdentifierInfo *Ident_final;
+ IdentifierInfo *Ident_override;
+
llvm::OwningPtr<PragmaHandler> AlignHandler;
llvm::OwningPtr<PragmaHandler> GCCVisibilityHandler;
llvm::OwningPtr<PragmaHandler> OptionsHandler;
@@ -1521,6 +1525,9 @@
ExprResult ParseCXX0XAlignArgument(SourceLocation Start);
+ bool isCXX0XVirtSpecifier() const;
+ void ParseOptionalCXX0XVirtSpecifierSeq();
+
/// DeclaratorScopeObj - RAII object used in Parser::ParseDirectDeclarator to
/// enter a new C++ declarator scope and exit it when the function is
/// finished.
Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDeclCXX.cpp?rev=123606&r1=123605&r2=123606&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseDeclCXX.cpp (original)
+++ cfe/trunk/lib/Parse/ParseDeclCXX.cpp Sun Jan 16 17:56:42 2011
@@ -1261,6 +1261,39 @@
}
}
+/// 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 @@
/// 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 @@
SkipUntil(tok::comma, true, true);
}
+ ParseOptionalCXX0XVirtSpecifierSeq();
+
// pure-specifier:
// '= 0'
//
Modified: cfe/trunk/lib/Parse/Parser.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/Parser.cpp?rev=123606&r1=123605&r2=123606&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/Parser.cpp (original)
+++ cfe/trunk/lib/Parse/Parser.cpp Sun Jan 16 17:56:42 2011
@@ -387,6 +387,12 @@
ObjCTypeQuals[objc_byref] = &PP.getIdentifierTable().get("byref");
}
+ // Initialize C++0x contextual keywords.
+ if (getLang().CPlusPlus0x) {
+ Ident_final = &PP.getIdentifierTable().get("final");
+ Ident_override = &PP.getIdentifierTable().get("override");
+ }
+
Ident_super = &PP.getIdentifierTable().get("super");
if (getLang().AltiVec) {
Added: cfe/trunk/test/Parser/cxx0x-override-control-keywords.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx0x-override-control-keywords.cpp?rev=123606&view=auto
==============================================================================
--- cfe/trunk/test/Parser/cxx0x-override-control-keywords.cpp (added)
+++ cfe/trunk/test/Parser/cxx0x-override-control-keywords.cpp Sun Jan 16 17:56:42 2011
@@ -0,0 +1,6 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++0x %s
+struct S {
+ virtual void final() final;
+ virtual void override() override;
+ virtual void n() new;
+};
More information about the cfe-commits
mailing list