[cfe-commits] r67033 - in /cfe/trunk: include/clang/Parse/DeclSpec.h lib/Parse/ParseDecl.cpp test/Parser/cxx-reference.cpp
Sebastian Redl
sebastian.redl at getdesigned.at
Sun Mar 15 15:02:01 PDT 2009
Author: cornedbee
Date: Sun Mar 15 17:02:01 2009
New Revision: 67033
URL: http://llvm.org/viewvc/llvm-project?rev=67033&view=rev
Log:
Parser support for rvalue references.
Modified:
cfe/trunk/include/clang/Parse/DeclSpec.h
cfe/trunk/lib/Parse/ParseDecl.cpp
cfe/trunk/test/Parser/cxx-reference.cpp
Modified: cfe/trunk/include/clang/Parse/DeclSpec.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/DeclSpec.h?rev=67033&r1=67032&r2=67033&view=diff
==============================================================================
--- cfe/trunk/include/clang/Parse/DeclSpec.h (original)
+++ cfe/trunk/include/clang/Parse/DeclSpec.h Sun Mar 15 17:02:01 2009
@@ -454,7 +454,9 @@
struct ReferenceTypeInfo {
/// The type qualifier: restrict. [GNU] C++ extension
- bool HasRestrict;
+ bool HasRestrict : 1;
+ /// True if this is an lvalue reference, false if it's an rvalue reference.
+ bool LValueRef : 1;
AttributeList *AttrList;
void destroy() {
delete AttrList;
@@ -633,11 +635,12 @@
/// getReference - Return a DeclaratorChunk for a reference.
///
static DeclaratorChunk getReference(unsigned TypeQuals, SourceLocation Loc,
- AttributeList *AL) {
+ AttributeList *AL, bool lvalue) {
DeclaratorChunk I;
I.Kind = Reference;
I.Loc = Loc;
I.Ref.HasRestrict = (TypeQuals & DeclSpec::TQ_restrict) != 0;
+ I.Ref.LValueRef = lvalue;
I.Ref.AttrList = AL;
return I;
}
Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=67033&r1=67032&r2=67033&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
+++ cfe/trunk/lib/Parse/ParseDecl.cpp Sun Mar 15 17:02:01 2009
@@ -1616,7 +1616,9 @@
/// ptr-operator:
/// '*' cv-qualifier-seq[opt]
/// '&'
+/// [C++0x] '&&'
/// [GNU] '&' restrict[opt] attributes[opt]
+/// [GNU?] '&&' restrict[opt] attributes[opt]
/// '::'[opt] nested-name-specifier '*' cv-qualifier-seq[opt]
void Parser::ParseDeclaratorInternal(Declarator &D,
DirectDeclParseFunction DirectDeclParser) {
@@ -1657,13 +1659,15 @@
tok::TokenKind Kind = Tok.getKind();
// Not a pointer, C++ reference, or block.
if (Kind != tok::star && (Kind != tok::amp || !getLang().CPlusPlus) &&
+ (Kind != tok::ampamp || !getLang().CPlusPlus0x) &&
(Kind != tok::caret || !getLang().Blocks)) {
if (DirectDeclParser)
(this->*DirectDeclParser)(D);
return;
}
- // Otherwise, '*' -> pointer, '^' -> block, '&' -> reference.
+ // Otherwise, '*' -> pointer, '^' -> block, '&' -> lvalue reference,
+ // '&&' -> rvalue reference
SourceLocation Loc = ConsumeToken(); // Eat the *, ^ or &.
D.SetRangeEnd(Loc);
@@ -1730,7 +1734,8 @@
// Remember that we parsed a reference type. It doesn't have type-quals.
D.AddTypeInfo(DeclaratorChunk::getReference(DS.getTypeQualifiers(), Loc,
- DS.TakeAttributes()),
+ DS.TakeAttributes(),
+ Kind == tok::amp),
SourceLocation());
}
}
Modified: cfe/trunk/test/Parser/cxx-reference.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx-reference.cpp?rev=67033&r1=67032&r2=67033&view=diff
==============================================================================
--- cfe/trunk/test/Parser/cxx-reference.cpp (original)
+++ cfe/trunk/test/Parser/cxx-reference.cpp Sun Mar 15 17:02:01 2009
@@ -1,4 +1,4 @@
-// RUN: clang -fsyntax-only -verify %s
+// RUN: clang -fsyntax-only -verify -std=c++0x %s
extern char *bork;
char *& bar = bork;
@@ -17,3 +17,8 @@
int & volatile Y = val; // expected-error {{'volatile' qualifier may not be applied to a reference}}
int & const volatile Z = val; /* expected-error {{'const' qualifier may not be applied}} \
expected-error {{'volatile' qualifier may not be applied}} */
+
+int && r1(int &&a);
+
+typedef int && R;
+void r2(const R a);
More information about the cfe-commits
mailing list