From 0fd8210f95926898933e372b6646a3ea69f2cacb Mon Sep 17 00:00:00 2001 From: Devin Coughlin Date: Wed, 11 Jan 2017 01:02:34 +0000 Subject: [PATCH] [analyzer] Fix crash in body farm for getter without implicit self. Fix a crash in body farm when synthesizing a getter for a property synthesized for a property declared in a protocol on a class extension that shadows a declaration of the property in a category. In this case, Sema doesn't fill in the implicit 'self' parameter for the getter in the category, which leads to a crash when trying to synthesize the getter for it. To avoid the crash, skip getter synthesis in body farm if the self parameter is not filled int. rdar://problem/29938138 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@291635 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/BodyFarm.cpp | 2 ++ test/Analysis/properties.m | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/lib/Analysis/BodyFarm.cpp b/lib/Analysis/BodyFarm.cpp index d202a04064..56c812c34c 100644 --- a/lib/Analysis/BodyFarm.cpp +++ b/lib/Analysis/BodyFarm.cpp @@ -467,6 +467,8 @@ static Stmt *createObjCPropertyGetter(ASTContext &Ctx, ASTMaker M(Ctx); const VarDecl *selfVar = Prop->getGetterMethodDecl()->getSelfDecl(); + if (!selfVar) + return nullptr; Expr *loadedIVar = M.makeObjCIvarRef( diff --git a/test/Analysis/properties.m b/test/Analysis/properties.m index b1305341e5..235a968782 100644 --- a/test/Analysis/properties.m +++ b/test/Analysis/properties.m @@ -315,6 +315,32 @@ void testConsistencyAssign(Person *p) { } @end +__attribute__((objc_root_class)) +@interface ClassWithPrivatePropertyInClassExtensionWithProtocolShadowingCategory +@end + +@protocol HasStuff +@property (nonatomic, readonly) int stuffProperty; +@end + +@interface ClassWithPrivatePropertyInClassExtensionWithProtocolShadowingCategory (Private) +@property (nonatomic, readonly) int stuffProperty; +@end + +@interface ClassWithPrivatePropertyInClassExtensionWithProtocolShadowingCategory (Internal) +@end + +@interface ClassWithPrivatePropertyInClassExtensionWithProtocolShadowingCategory() +@end + +@implementation ClassWithPrivatePropertyInClassExtensionWithProtocolShadowingCategory +@synthesize stuffProperty = _stuffProperty; + +-(void)foo { + (void)self.stuffProperty; +} +@end + //------ // Setter ivar invalidation. //------ -- 2.50.1