Skip to content

Commit

Permalink
[ObjC] Prevent infinite loops when iterating over redeclaration
Browse files Browse the repository at this point in the history
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

llvm-svn: 287530
  • Loading branch information
hyp committed Nov 21, 2016
1 parent 9229d33 commit ff6c34b
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 0 deletions.
6 changes: 6 additions & 0 deletions clang/lib/AST/DeclObjC.cpp
Expand Up @@ -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(),
Expand Down
21 changes: 21 additions & 0 deletions clang/test/SemaObjC/method-redecls-invalid-interface.m
@@ -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

0 comments on commit ff6c34b

Please sign in to comment.