diff --git a/include/clang/Basic/DiagnosticKinds.def b/include/clang/Basic/DiagnosticKinds.def index b935ff0f29..d049b6c655 100644 --- a/include/clang/Basic/DiagnosticKinds.def +++ b/include/clang/Basic/DiagnosticKinds.def @@ -587,6 +587,8 @@ DIAG(warn_parens_disambiguated_as_function_decl, WARNING, "parentheses were disambiguated as a function declarator") DIAG(err_expected_member_or_base_name, ERROR, "expected class member or base class name") +DIAG(ext_ellipsis_exception_spec, EXTENSION, + "exception specification of '...' is a Microsoft extension") // Language specific pragmas 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(); diff --git a/test/SemaCXX/ms-exception-spec.cpp b/test/SemaCXX/ms-exception-spec.cpp new file mode 100644 index 0000000000..ec4e29a89f --- /dev/null +++ b/test/SemaCXX/ms-exception-spec.cpp @@ -0,0 +1,3 @@ +// RUN: clang %s -fsyntax-only -verify -fms-extensions + +void f() throw(...) { }