diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-12-20 23:57:46 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-12-20 23:57:46 +0000 |
commit | 830837da534fa1620ec523903beb0e6d452c179d (patch) | |
tree | b4e149f9f9912f71709358e88bd586a64151ea28 /clang/lib/Parse/ParseDeclCXX.cpp | |
parent | c6beda80fff9d210b91234cac315d88725c9abb2 (diff) | |
download | bcm5719-llvm-830837da534fa1620ec523903beb0e6d452c179d.tar.gz bcm5719-llvm-830837da534fa1620ec523903beb0e6d452c179d.zip |
Extend the parser to support pack expansions within exception
specifications. We can't yet instantiate them, however, since I
tripped over PR8835.
llvm-svn: 122292
Diffstat (limited to 'clang/lib/Parse/ParseDeclCXX.cpp')
-rw-r--r-- | clang/lib/Parse/ParseDeclCXX.cpp | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp index a2c87f85c30..e1f7f7bdc58 100644 --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/lib/Parse/ParseDeclCXX.cpp @@ -1875,8 +1875,8 @@ Parser::MemInitResult Parser::ParseMemInitializer(Decl *ConstructorDecl) { /// [MS] 'throw' '(' '...' ')' /// /// type-id-list: -/// type-id -/// type-id-list ',' type-id +/// type-id ... [opt] +/// type-id-list ',' type-id ... [opt] /// bool Parser::ParseExceptionSpecification(SourceLocation &EndLoc, llvm::SmallVectorImpl<ParsedType> @@ -1908,10 +1908,21 @@ bool Parser::ParseExceptionSpecification(SourceLocation &EndLoc, SourceRange Range; while (Tok.isNot(tok::r_paren)) { TypeResult Res(ParseTypeName(&Range)); + + if (Tok.is(tok::ellipsis)) { + // C++0x [temp.variadic]p5: + // - In a dynamic-exception-specification (15.4); the pattern is a + // type-id. + SourceLocation Ellipsis = ConsumeToken(); + if (!Res.isInvalid()) + Res = Actions.ActOnPackExpansion(Res.get(), Ellipsis); + } + if (!Res.isInvalid()) { Exceptions.push_back(Res.get()); Ranges.push_back(Range); } + if (Tok.is(tok::comma)) ConsumeToken(); else |