mirror of https://github.com/microsoft/clang.git
[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:
parent
e960676a07
commit
df24b15e72
|
@ -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(),
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue