From 91d7af223a623118f77a02bc5ad368632f4f5a6f Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Fri, 4 Feb 2011 11:57:16 +0000 Subject: [PATCH] Fix a crash-on-invalid where we were trying to parse C++ constructs in C, then hitting an assertion because C code shouldn't try to parse optional nested-name-specifiers. Fixes PR9137. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124860 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Parse/Parser.cpp | 5 +++-- test/Parser/cxx-in-c.c | 5 +++++ 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 test/Parser/cxx-in-c.c diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp index 3327f7b5a..4b2bd0d89 100644 --- a/lib/Parse/Parser.cpp +++ b/lib/Parse/Parser.cpp @@ -739,8 +739,9 @@ Decl *Parser::ParseFunctionDefinition(ParsingDeclarator &D, // We should have either an opening brace or, in a C++ constructor, // we may have a colon. - if (Tok.isNot(tok::l_brace) && Tok.isNot(tok::colon) && - Tok.isNot(tok::kw_try)) { + if (Tok.isNot(tok::l_brace) && + (!getLang().CPlusPlus || + (Tok.isNot(tok::colon) && Tok.isNot(tok::kw_try)))) { Diag(Tok, diag::err_expected_fn_body); // Skip over garbage, until we get to '{'. Don't eat the '{'. diff --git a/test/Parser/cxx-in-c.c b/test/Parser/cxx-in-c.c new file mode 100644 index 000000000..50212ad0b --- /dev/null +++ b/test/Parser/cxx-in-c.c @@ -0,0 +1,5 @@ +// RUN: %clang_cc1 -fsyntax-only -verify + +// PR9137 +void f0(int x) : {}; +void f1(int x) try {}; -- 2.11.4.GIT