<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On 20 June 2017 at 16:53, Duncan P. N. Exon Smith <span dir="ltr"><<a href="mailto:dexonsmith@apple.com" target="_blank">dexonsmith@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word"><br><div><div><div class="gmail-h5"><blockquote type="cite"><div>On Jun 19, 2017, at 10:53, Alex Lorenz via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>> wrote:</div><br class="gmail-m_5817762689990054982Apple-interchange-newline"><div><div>Author: arphaman<br>Date: Mon Jun 19 12:53:21 2017<br>New Revision: 305719<br><br>URL: <a href="http://llvm.org/viewvc/llvm-project?rev=305719&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=305719&view=rev</a><br>Log:<br>[Parser][ObjC] Use an artificial EOF token while parsing lexed ObjC methods<br><br>This change avoid a crash that occurred when skipping to EOF while parsing an<br>ObjC interface/implementation.<br><br><a>rdar://31963299</a><br><br>Differential Revision: <a href="https://reviews.llvm.org/D34185" target="_blank">https://reviews.llvm.org/<wbr>D34185</a><br><br>Added:<br>    cfe/trunk/test/Parser/objc-<wbr>at-implementation-eof-crash.m<br>    cfe/trunk/test/Parser/objc-<wbr>at-interface-eof-crash.m<br>Modified:<br>    cfe/trunk/lib/Parse/<wbr>ParseObjc.cpp<br><br>Modified: cfe/trunk/lib/Parse/ParseObjc.<wbr>cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseObjc.cpp?rev=305719&r1=305718&r2=305719&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Parse/<wbr>ParseObjc.cpp?rev=305719&r1=<wbr>305718&r2=305719&view=diff</a><br>==============================<wbr>==============================<wbr>==================<br>--- cfe/trunk/lib/Parse/ParseObjc.<wbr>cpp (original)<br>+++ cfe/trunk/lib/Parse/ParseObjc.<wbr>cpp Mon Jun 19 12:53:21 2017<br>@@ -3627,6 +3627,14 @@ void Parser::<wbr>ParseLexedObjCMethodDefs(Le<br>   SourceLocation OrigLoc = Tok.getLocation();<br><br>   assert(!LM.Toks.empty() && "ParseLexedObjCMethodDef - Empty body!");<br>+  // Store an artificial EOF token to ensure that we don't run off the end of<br>+  // the method's body when we come to parse it.<br>+  Token Eof;<br>+  Eof.startToken();<br>+  Eof.setKind(tok::eof);<br>+  Eof.setEofData(MCDecl);<br>+  Eof.setLocation(OrigLoc);<br>+  LM.Toks.push_back(Eof);<br>   // Append the current token at the end of the new token stream so that it<br>   // doesn't get lost.<br>   LM.Toks.push_back(Tok);<br>@@ -3658,7 +3666,7 @@ void Parser::<wbr>ParseLexedObjCMethodDefs(Le<br>       Actions.<wbr>ActOnDefaultCtorInitializers(<wbr>MCDecl);<br>     <wbr>ParseFunctionStatementBody(<wbr>MCDecl, BodyScope);<br>   }<br>-  <br>+<br>   if (Tok.getLocation() != OrigLoc) {<br>     // Due to parsing error, we either went over the cached tokens or<br>     // there are still cached tokens left. If it's the latter case skip the<br>@@ -3670,4 +3678,6 @@ void Parser::<wbr>ParseLexedObjCMethodDefs(Le<br>       while (Tok.getLocation() != OrigLoc && Tok.isNot(tok::eof))<br>         ConsumeAnyToken();<br>   }<br>+  // Clean up the remaining EOF token.<br>+  ConsumeAnyToken();<br> }<br><br>Added: cfe/trunk/test/Parser/objc-at-<wbr>implementation-eof-crash.m<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/objc-at-implementation-eof-crash.m?rev=305719&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/Parser/<wbr>objc-at-implementation-eof-<wbr>crash.m?rev=305719&view=auto</a><br>==============================<wbr>==============================<wbr>==================<br>--- cfe/trunk/test/Parser/objc-at-<wbr>implementation-eof-crash.m (added)<br>+++ cfe/trunk/test/Parser/objc-at-<wbr>implementation-eof-crash.m Mon Jun 19 12:53:21 2017<br>@@ -0,0 +1,21 @@<br>+// RUN: %clang_cc1 -verify -Wno-objc-root-class %s<br>+<br>+@interface ClassA<br>+<br>+- (void)fileExistsAtPath:(int)x;<br>+<br>+@end<br>+<br>+@interface ClassB<br>+<br>+@end<br>+<br>+@implementation ClassB // expected-note {{implementation started here}}<br>+<br>+- (void) method:(ClassA *)mgr { // expected-note {{to match this '{'}}<br>+  mgr fileExistsAtPath:0<br>+} // expected-error {{expected ']'}}<br>+<br>+@implementation ClassC // expected-error {{missing '@end'}} // expected-error {{expected '}'}} // expected-warning {{cannot find interface declaration for 'ClassC'}}<br></div></div></blockquote><div><br></div></div></div><div>I believe you can split these expectations over multiple lines.  Something like this seems more readable:</div><div><br></div></div><div><div class="gmail-h5"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div><font face="Menlo">@implementation ClassC                 \</font></div><div><font face="Menlo">  // expected-error {{missing '@end'}} \</font></div><div><font face="Menlo">  // expected-error {{expected '}'}}   \</font></div><div><font face="Menlo">  // expected-warning {{cannot find interface declaration for 'ClassC'}}</font></div></div></blockquote></div></div></div></blockquote><div><br></div><div>Thanks, addressed in r305803!</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word"><div><div class="gmail-h5"><div><br></div></div></div><div><div><div class="gmail-h5"><blockquote type="cite"><div><div>+<br>+@end<br><br>Added: cfe/trunk/test/Parser/objc-at-<wbr>interface-eof-crash.m<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/objc-at-interface-eof-crash.m?rev=305719&view=auto" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/Parser/<wbr>objc-at-interface-eof-crash.m?<wbr>rev=305719&view=auto</a><br>==============================<wbr>==============================<wbr>==================<br>--- cfe/trunk/test/Parser/objc-at-<wbr>interface-eof-crash.m (added)<br>+++ cfe/trunk/test/Parser/objc-at-<wbr>interface-eof-crash.m Mon Jun 19 12:53:21 2017<br>@@ -0,0 +1,21 @@<br>+// RUN: %clang_cc1 -verify -Wno-objc-root-class %s<br>+<br>+@interface ClassA<br>+<br>+- (void)fileExistsAtPath:(int)x;<br>+<br>+@end<br>+<br>+@interface ClassB<br>+<br>+@end<br>+<br>+@implementation ClassB // expected-note {{implementation started here}}<br>+<br>+- (void) method:(ClassA *)mgr { // expected-note {{to match this '{'}}<br>+  mgr fileExistsAtPath:0<br>+} // expected-error {{expected ']'}}<br>+<br>+@interface ClassC // expected-error {{missing '@end'}} // expected-error {{expected '}'}}<br></div></div></blockquote><div><br></div></div></div><div>Same recommendation as above.</div><span class="gmail-"><br><blockquote type="cite"><div><div>+<br>+@end<br><br><br>______________________________<wbr>_________________<br>cfe-commits mailing list<br><a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br></div></div></blockquote></span></div><br></div></blockquote></div><br></div></div>