From: Chris Lattner Date: Fri, 9 Jan 2009 04:34:13 +0000 (+0000) Subject: Fix rdar://6480479 - [parser] infinite loop on invalid input X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1fd80116b49782c367ff5d5f50a8b76dd8a5d7f7;p=clang Fix rdar://6480479 - [parser] infinite loop on invalid input git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61975 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp index f52ecfb7fb..90a1494966 100644 --- a/lib/Parse/ParseObjc.cpp +++ b/lib/Parse/ParseObjc.cpp @@ -255,6 +255,12 @@ void Parser::ParseObjCInterfaceDeclList(DeclTy *interfaceDecl, // If we don't have an @ directive, parse it as a function definition. if (Tok.isNot(tok::at)) { + // The code below does not consume '}'s because it is afraid of eating the + // end of a namespace. Because of the way this code is structured, an + // erroneous r_brace would cause an infinite loop if not handled here. + if (Tok.is(tok::r_brace)) + break; + // FIXME: as the name implies, this rule allows function definitions. // We could pass a flag or check for functions during semantic analysis. ParseDeclarationOrFunctionDefinition(); diff --git a/test/Parser/objc-quirks.m b/test/Parser/objc-quirks.m index b726d9a827..c5fe8bb1a1 100644 --- a/test/Parser/objc-quirks.m +++ b/test/Parser/objc-quirks.m @@ -2,3 +2,9 @@ // FIXME: This is a horrible error message here. Fix. int @"s" = 5; // expected-error {{prefix attribute must be}} + + +// rdar://6480479 +@interface A +}; // expected-error {{missing @end}} expected-error {{expected external declaration}} +