diff --git a/clang/lib/Parse/ParseObjc.cpp b/clang/lib/Parse/ParseObjc.cpp index 4a572f199328..607b953aad41 100644 --- a/clang/lib/Parse/ParseObjc.cpp +++ b/clang/lib/Parse/ParseObjc.cpp @@ -1541,6 +1541,12 @@ Parser::ParseObjCAtImplementationDeclaration(SourceLocation AtLoc) { return DeclGroupPtrTy(); } rparenLoc = ConsumeParen(); + if (Tok.is(tok::less)) { // we have illegal '<' try to recover + Diag(Tok, diag::err_unexpected_protocol_qualifier); + AttributeFactory attr; + DeclSpec DS(attr); + (void)ParseObjCProtocolQualifiers(DS); + } ObjCImpDecl = Actions.ActOnStartCategoryImplementation( AtLoc, nameId, nameLoc, categoryId, categoryLoc); diff --git a/clang/test/Parser/objc-error-qualified-implementation.m b/clang/test/Parser/objc-error-qualified-implementation.m index 444fb5dab44c..8bbd50236027 100644 --- a/clang/test/Parser/objc-error-qualified-implementation.m +++ b/clang/test/Parser/objc-error-qualified-implementation.m @@ -19,3 +19,11 @@ @implementation K

'}} + +// rdar://13920026 +@implementation I (Cat)

// expected-error {{@implementation declaration can not be protocol qualified}} +- (void) Meth {} +@end + +@implementation I (Cat1)

'}}