diff options
Diffstat (limited to 'lib/Parse/ParseDeclCXX.cpp')
-rw-r--r-- | lib/Parse/ParseDeclCXX.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index 268de00bc3..78539abaad 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -763,12 +763,13 @@ Parser::MemInitResult Parser::ParseMemInitializer(DeclTy *ConstructorDecl) { /// ParseExceptionSpecification - Parse a C++ exception-specification /// (C++ [except.spec]). /// -/// exception-specification: -/// 'throw' '(' type-id-list [opt] ')' +/// exception-specification: +/// 'throw' '(' type-id-list [opt] ')' +/// [MS] 'throw' '(' '...' ')' /// -/// type-id-list: -/// type-id -/// type-id-list ',' type-id +/// type-id-list: +/// type-id +/// type-id-list ',' type-id /// bool Parser::ParseExceptionSpecification() { assert(Tok.is(tok::kw_throw) && "expected throw"); @@ -780,6 +781,16 @@ bool Parser::ParseExceptionSpecification() { } SourceLocation LParenLoc = ConsumeParen(); + // Parse throw(...), a Microsoft extension that means "this function + // can throw anything". + if (Tok.is(tok::ellipsis)) { + SourceLocation EllipsisLoc = ConsumeToken(); + if (!getLang().Microsoft) + Diag(EllipsisLoc, diag::ext_ellipsis_exception_spec); + SourceLocation RParenLoc = MatchRHSPunctuation(tok::r_paren, LParenLoc); + return false; + } + // Parse the sequence of type-ids. while (Tok.isNot(tok::r_paren)) { ParseTypeName(); |