diff --git a/clang/lib/AST/DeclObjC.cpp b/clang/lib/AST/DeclObjC.cpp --- a/clang/lib/AST/DeclObjC.cpp +++ b/clang/lib/AST/DeclObjC.cpp @@ -950,7 +950,8 @@ if (!Redecl && isRedeclaration()) { // This is the last redeclaration, go back to the first method. return cast(CtxD)->getMethod(getSelector(), - isInstanceMethod()); + isInstanceMethod(), + /*AllowHidden=*/true); } return Redecl ? Redecl : this; @@ -983,7 +984,8 @@ if (isRedeclaration()) { // It is possible that we have not done deserializing the ObjCMethod yet. ObjCMethodDecl *MD = - cast(CtxD)->getMethod(Sel, isInstanceMethod()); + cast(CtxD)->getMethod(Sel, isInstanceMethod(), + /*AllowHidden=*/true); return MD ? MD : this; } @@ -1308,8 +1310,9 @@ const ObjCMethodDecl *Method = this; if (Method->isRedeclaration()) { - Method = cast(Method->getDeclContext())-> - getMethod(Method->getSelector(), Method->isInstanceMethod()); + Method = cast(Method->getDeclContext()) + ->getMethod(Method->getSelector(), Method->isInstanceMethod(), + /*AllowHidden=*/true); } if (Method->isOverriding()) { diff --git a/clang/test/Index/Inputs/hidden-redecls-sub.h b/clang/test/Index/Inputs/hidden-redecls-sub.h new file mode 100644 --- /dev/null +++ b/clang/test/Index/Inputs/hidden-redecls-sub.h @@ -0,0 +1,7 @@ +@protocol P1 +- (void)p1_method; +- (void)p1_method; +@end + +@interface Foo (SubP1) +@end diff --git a/clang/test/Index/Inputs/hidden-redecls.h b/clang/test/Index/Inputs/hidden-redecls.h new file mode 100644 --- /dev/null +++ b/clang/test/Index/Inputs/hidden-redecls.h @@ -0,0 +1,3 @@ +@interface Foo +- (void)parent_method; +@end diff --git a/clang/test/Index/Inputs/module.map b/clang/test/Index/Inputs/module.map --- a/clang/test/Index/Inputs/module.map +++ b/clang/test/Index/Inputs/module.map @@ -20,3 +20,11 @@ export * } } + +module hidden_redecls { + header "hidden-redecls.h" + + explicit module sub { + header "hidden-redecls-sub.h" + } +} diff --git a/clang/test/Index/hidden-redecls.m b/clang/test/Index/hidden-redecls.m new file mode 100644 --- /dev/null +++ b/clang/test/Index/hidden-redecls.m @@ -0,0 +1,12 @@ +@import hidden_redecls; + +@interface Foo (Top) +- (void)top_method; +@end + +// p1_method in protocol P1 is hidden since module_redecls.sub hasn't been +// imported yet. Check it is still indexed. + +// RUN: c-index-test -index-file-full %s -isystem %S/Inputs -fmodules -target x86_64-apple-macosx10.7 | FileCheck %s +// CHECK: [indexDeclaration]: kind: objc-instance-method | name: p1_method | {{.*}} | loc: {{.*}}hidden-redecls-sub.h:2:9 | {{.*}} | isRedecl: 0 +// CHECK: [indexDeclaration]: kind: objc-instance-method | name: p1_method | {{.*}} | loc: {{.*}}hidden-redecls-sub.h:3:9 | {{.*}} | isRedecl: 1