[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


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@287530 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Alex Lorenz 2016-11-21 11:16:30 +00:00
parent e960676a07
commit df24b15e72
2 changed files with 27 additions and 0 deletions

View File

@ -870,6 +870,12 @@ ObjCMethodDecl *ObjCMethodDecl::getNextRedeclarationImpl() {
}
}
// 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(),

View File

@ -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