r180228 - Objective-C parsing [qoi]: Recover gracefully with good diagnostic

Fariborz Jahanian fjahanian at apple.com
Wed Apr 24 16:23:47 PDT 2013


Author: fjahanian
Date: Wed Apr 24 18:23:47 2013
New Revision: 180228

URL: http://llvm.org/viewvc/llvm-project?rev=180228&view=rev
Log:
Objective-C parsing [qoi]: Recover gracefully with good diagnostic
when class implementation declaration adds protocol qualifier
list. // rdar://12233858

Added:
    cfe/trunk/test/Parser/objc-error-qualified-implementation.m
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
    cfe/trunk/lib/Parse/ParseObjc.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=180228&r1=180227&r2=180228&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Wed Apr 24 18:23:47 2013
@@ -413,6 +413,8 @@ def err_missing_catch_finally : Error<
 def err_objc_concat_string : Error<"unexpected token after Objective-C string">;
 def err_expected_objc_container : Error<
   "'@end' must appear in an Objective-C context">;
+def err_unexpected_protocol_qualifier : Error<
+  "@implementation declaration can not be protocol qualified">;
 def err_objc_unexpected_atend : Error<
   "'@end' appears where closing brace '}' is expected">;
 def error_property_ivar_decl : Error<

Modified: cfe/trunk/lib/Parse/ParseObjc.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseObjc.cpp?rev=180228&r1=180227&r2=180228&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseObjc.cpp (original)
+++ cfe/trunk/lib/Parse/ParseObjc.cpp Wed Apr 24 18:23:47 2013
@@ -1565,6 +1565,13 @@ Parser::ParseObjCAtImplementationDeclara
   
     if (Tok.is(tok::l_brace)) // we have ivars
       ParseObjCClassInstanceVariables(ObjCImpDecl, tok::objc_private, AtLoc);
+    else if (Tok.is(tok::less)) { // we have illegal '<' try to recover
+      Diag(Tok, diag::err_unexpected_protocol_qualifier);
+      // try to recover.
+      AttributeFactory attr;
+      DeclSpec DS(attr);
+      (void)ParseObjCProtocolQualifiers(DS);
+    }
   }
   assert(ObjCImpDecl);
 

Added: cfe/trunk/test/Parser/objc-error-qualified-implementation.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/objc-error-qualified-implementation.m?rev=180228&view=auto
==============================================================================
--- cfe/trunk/test/Parser/objc-error-qualified-implementation.m (added)
+++ cfe/trunk/test/Parser/objc-error-qualified-implementation.m Wed Apr 24 18:23:47 2013
@@ -0,0 +1,21 @@
+// RUN: %clang_cc1 -fsyntax-only -Wno-objc-root-class -verify %s
+// rdar://12233858
+
+ at protocol P
+ at end
+
+ at interface I @end
+
+ at implementation I<P> @end // expected-error {{@implementation declaration can not be protocol qualified}}
+
+ at interface J < P,P >
+ at end
+
+
+ at implementation J < P,P > // expected-error {{@implementation declaration can not be protocol qualified}}
+ at end
+
+ at interface K @end
+
+ at implementation K <P // expected-error {{@implementation declaration can not be protocol qualified}}
+ at end // expected-error {{expected '>'}}





More information about the cfe-commits mailing list