diff options
author | David Blaikie <dblaikie@gmail.com> | 2012-01-24 06:03:59 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2012-01-24 06:03:59 +0000 |
commit | 186a8899a4372bafba15fde0d73e01ed7eae445b (patch) | |
tree | 97d6b9935bd23e9c20c0227d181c9fac45e4c6a4 /clang/lib/Parse/ParseDeclCXX.cpp | |
parent | e166a8548fcf7863a90df4cf6495dfad9ff2702a (diff) | |
download | bcm5719-llvm-186a8899a4372bafba15fde0d73e01ed7eae445b.tar.gz bcm5719-llvm-186a8899a4372bafba15fde0d73e01ed7eae445b.zip |
Support decltype in member initializers.
This is the last piece of N3031 (decltype in weird places) - supporting
the use of decltype in a class ctor's member-initializer-list to
specify the base classes to initialize.
Reviewed by Richard Smith.
llvm-svn: 148789
Diffstat (limited to 'clang/lib/Parse/ParseDeclCXX.cpp')
-rw-r--r-- | clang/lib/Parse/ParseDeclCXX.cpp | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp index 050b1b19c4e..14c8955949e 100644 --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/lib/Parse/ParseDeclCXX.cpp @@ -2414,15 +2414,28 @@ Parser::MemInitResult Parser::ParseMemInitializer(Decl *ConstructorDecl) { TemplateTypeTy = getTypeAnnotation(Tok); } } - if (!TemplateTypeTy && Tok.isNot(tok::identifier)) { + // Uses of decltype will already have been converted to annot_decltype by + // ParseOptionalCXXScopeSpecifier at this point. + if (!TemplateTypeTy && Tok.isNot(tok::identifier) + && Tok.isNot(tok::annot_decltype)) { Diag(Tok, diag::err_expected_member_or_base_name); return true; } - // Get the identifier. This may be a member name or a class name, - // but we'll let the semantic analysis determine which it is. - IdentifierInfo *II = Tok.is(tok::identifier) ? Tok.getIdentifierInfo() : 0; - SourceLocation IdLoc = ConsumeToken(); + IdentifierInfo *II = 0; + DeclSpec DS(AttrFactory); + SourceLocation IdLoc = Tok.getLocation(); + if (Tok.is(tok::annot_decltype)) { + // Get the decltype expression, if there is one. + ParseDecltypeSpecifier(DS); + } else { + if (Tok.is(tok::identifier)) + // Get the identifier. This may be a member name or a class name, + // but we'll let the semantic analysis determine which it is. + II = Tok.getIdentifierInfo(); + ConsumeToken(); + } + // Parse the '('. if (getLang().CPlusPlus0x && Tok.is(tok::l_brace)) { @@ -2437,8 +2450,8 @@ Parser::MemInitResult Parser::ParseMemInitializer(Decl *ConstructorDecl) { EllipsisLoc = ConsumeToken(); return Actions.ActOnMemInitializer(ConstructorDecl, getCurScope(), SS, II, - TemplateTypeTy, IdLoc, InitList.take(), - EllipsisLoc); + TemplateTypeTy, DS, IdLoc, + InitList.take(), EllipsisLoc); } else if(Tok.is(tok::l_paren)) { BalancedDelimiterTracker T(*this, tok::l_paren); T.consumeOpen(); @@ -2458,7 +2471,7 @@ Parser::MemInitResult Parser::ParseMemInitializer(Decl *ConstructorDecl) { EllipsisLoc = ConsumeToken(); return Actions.ActOnMemInitializer(ConstructorDecl, getCurScope(), SS, II, - TemplateTypeTy, IdLoc, + TemplateTypeTy, DS, IdLoc, T.getOpenLocation(), ArgExprs.take(), ArgExprs.size(), T.getCloseLocation(), EllipsisLoc); |