From: Alex Lorenz Date: Wed, 22 Feb 2017 23:18:49 +0000 (+0000) Subject: [ObjC][Modules] Don't perform property lookup in hidden class extensions X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b10bb3222f717f6181b0fc845870dbbf4d1c429d;p=clang [ObjC][Modules] Don't perform property lookup in hidden class extensions rdar://30603803 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@295903 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index 60d05f682e..9218eb537a 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -162,10 +162,10 @@ ObjCPropertyDecl::findPropertyDecl(const DeclContext *DC, return nullptr; } - // If context is class, then lookup property in its extensions. + // If context is class, then lookup property in its visible extensions. // This comes before property is looked up in primary class. if (auto *IDecl = dyn_cast(DC)) { - for (const auto *Ext : IDecl->known_extensions()) + for (const auto *Ext : IDecl->visible_extensions()) if (ObjCPropertyDecl *PD = ObjCPropertyDecl::findPropertyDecl(Ext, propertyID, queryKind)) diff --git a/test/Modules/Inputs/category_right_sub.h b/test/Modules/Inputs/category_right_sub.h index 231f65ffe0..c8ba7937f5 100644 --- a/test/Modules/Inputs/category_right_sub.h +++ b/test/Modules/Inputs/category_right_sub.h @@ -15,3 +15,8 @@ @interface Foo(LeftP4) @end + +// A hidden extension +@interface Foo () +@property (assign) int hiddenPropertyFromExtension; +@end diff --git a/test/Modules/objc-categories.m b/test/Modules/objc-categories.m index 42baf352fb..fcffe3cc96 100644 --- a/test/Modules/objc-categories.m +++ b/test/Modules/objc-categories.m @@ -53,6 +53,9 @@ void test_hidden_all_errors(Foo *foo) { p3p = foo.p3_prop; // expected-error{{property 'p3_prop' not found on object of type 'Foo *'}} id p4p = p4.p4_prop; // expected-error{{property 'p4_prop' not found on object of type 'id'}} p4p = foo.p4_prop; // expected-error{{property 'p4_prop' not found on object of type 'Foo *'}} + + if (foo.hiddenPropertyFromExtension) { // expected-error {{property 'hiddenPropertyFromExtension' not found on object of type 'Foo *'}} + } } @import category_left.sub; @@ -74,6 +77,7 @@ void test_hidden_right_errors(Foo *foo) { id p4p = p4.p4_prop; // expected-error{{property 'p4_prop' not found on object of type 'id'}} p4p = foo.p4_prop; // expected-error{{property 'p4_prop' not found on object of type 'Foo *'; did you mean 'p3_prop'?}} // expected-note@Inputs/category_left_sub.h:7{{'p3_prop' declared here}} + int hiddenFromExtension = foo.hiddenPropertyFromExtension; // expected-error {{property 'hiddenPropertyFromExtension' not found on object of type 'Foo *'}} } @import category_right.sub; @@ -92,4 +96,6 @@ void test_hidden_okay(Foo *foo) { p3p = foo.p3_prop; id p4p = p4.p4_prop; p4p = foo.p4_prop; + if (foo.hiddenPropertyFromExtension) { + } }