This revision was automatically updated to reflect the committed changes.
arphaman marked 6 inline comments as done.
Closed by commit rL287530: [ObjC] Prevent infinite loops when iterating over 
redeclaration (authored by arphaman).

Changed prior to commit:
  https://reviews.llvm.org/D26664?vs=77980&id=78699#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D26664

Files:
  cfe/trunk/lib/AST/DeclObjC.cpp
  cfe/trunk/test/SemaObjC/method-redecls-invalid-interface.m


Index: cfe/trunk/lib/AST/DeclObjC.cpp
===================================================================
--- cfe/trunk/lib/AST/DeclObjC.cpp
+++ cfe/trunk/lib/AST/DeclObjC.cpp
@@ -870,6 +870,12 @@
     }
   }
 
+  // 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(),
Index: cfe/trunk/test/SemaObjC/method-redecls-invalid-interface.m
===================================================================
--- cfe/trunk/test/SemaObjC/method-redecls-invalid-interface.m
+++ cfe/trunk/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


Index: cfe/trunk/lib/AST/DeclObjC.cpp
===================================================================
--- cfe/trunk/lib/AST/DeclObjC.cpp
+++ cfe/trunk/lib/AST/DeclObjC.cpp
@@ -870,6 +870,12 @@
     }
   }
 
+  // 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(),
Index: cfe/trunk/test/SemaObjC/method-redecls-invalid-interface.m
===================================================================
--- cfe/trunk/test/SemaObjC/method-redecls-invalid-interface.m
+++ cfe/trunk/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
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to