Author: arphaman Date: Mon Nov 21 05:16:30 2016 New Revision: 287530 URL: http://llvm.org/viewvc/llvm-project?rev=287530&view=rev Log: [ObjC] Prevent infinite loops when iterating over redeclaration of a method that was declared in an invalid interface
This commit fixes an infinite loop that occurs when clang tries to iterate over redeclaration of a method that was declared in an invalid @interface. The existing validity checks don't catch this as that @interface is a duplicate of a previously declared valid @interface declaration, so we have to verify that the found redeclaration is in a valid declaration context. rdar://29220965 Differential Revision: https://reviews.llvm.org/D26664 Added: cfe/trunk/test/SemaObjC/method-redecls-invalid-interface.m Modified: cfe/trunk/lib/AST/DeclObjC.cpp Modified: cfe/trunk/lib/AST/DeclObjC.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclObjC.cpp?rev=287530&r1=287529&r2=287530&view=diff ============================================================================== --- cfe/trunk/lib/AST/DeclObjC.cpp (original) +++ cfe/trunk/lib/AST/DeclObjC.cpp Mon Nov 21 05:16:30 2016 @@ -870,6 +870,12 @@ ObjCMethodDecl *ObjCMethodDecl::getNextR } } + // Ensure that the discovered method redeclaration has a valid declaration + // context. Used to prevent infinite loops when iterating redeclarations in + // a partially invalid AST. + if (Redecl && cast<Decl>(Redecl->getDeclContext())->isInvalidDecl()) + Redecl = nullptr; + if (!Redecl && isRedeclaration()) { // This is the last redeclaration, go back to the first method. return cast<ObjCContainerDecl>(CtxD)->getMethod(getSelector(), Added: cfe/trunk/test/SemaObjC/method-redecls-invalid-interface.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/method-redecls-invalid-interface.m?rev=287530&view=auto ============================================================================== --- cfe/trunk/test/SemaObjC/method-redecls-invalid-interface.m (added) +++ cfe/trunk/test/SemaObjC/method-redecls-invalid-interface.m Mon Nov 21 05:16:30 2016 @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -Wdocumentation -Wno-objc-root-class %s +// rdar://29220965 + +@interface InvalidInterface { // expected-note {{previous definition is here}} + int *_property; +} + +@end + +/*! + */ + +@interface InvalidInterface // expected-error {{duplicate interface definition for class 'InvalidInterface'}} +@property int *property; + +-(void) method; +@end + +@implementation InvalidInterface +-(void) method { } +@end _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits