summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Dergachev <artem.dergachev@gmail.com>2019-12-04 16:26:16 -0800
committerArtem Dergachev <artem.dergachev@gmail.com>2019-12-04 16:29:08 -0800
commit3c50f2544f7a8f0c41f4fc286064abce2d3629b5 (patch)
tree4f06fb5be478ff0e395b1abc1f361802ea486269
parent07e445103e363c85ce7313c542dee20b2294fe72 (diff)
downloadbcm5719-llvm-3c50f2544f7a8f0c41f4fc286064abce2d3629b5.tar.gz
bcm5719-llvm-3c50f2544f7a8f0c41f4fc286064abce2d3629b5.zip
[analyzer] Fix more ObjC accessor body farms after 2073dd2d.
Fix a crash when constructing a body farm for accessors of a property that is declared and @synthesize'd in different (but related) interfaces with the explicit ivar syntax. This is a follow-up for 0b58b80e.
-rw-r--r--clang/lib/Analysis/BodyFarm.cpp12
-rw-r--r--clang/test/Analysis/properties.m10
2 files changed, 17 insertions, 5 deletions
diff --git a/clang/lib/Analysis/BodyFarm.cpp b/clang/lib/Analysis/BodyFarm.cpp
index 694913b3ac9..1a789155054 100644
--- a/clang/lib/Analysis/BodyFarm.cpp
+++ b/clang/lib/Analysis/BodyFarm.cpp
@@ -741,13 +741,17 @@ static Stmt *createObjCPropertyGetter(ASTContext &Ctx,
// First, find the backing ivar.
const ObjCIvarDecl *IVar = nullptr;
- // Property accessor stubs sometimes do not correspond to any property.
+ // Property accessor stubs sometimes do not correspond to any property decl
+ // in the current interface (but in a superclass). They still have a
+ // corresponding property impl decl in this case.
if (MD->isSynthesizedAccessorStub()) {
const ObjCInterfaceDecl *IntD = MD->getClassInterface();
const ObjCImplementationDecl *ImpD = IntD->getImplementation();
- for (const auto *V: ImpD->ivars()) {
- if (V->getName() == MD->getSelector().getNameForSlot(0))
- IVar = V;
+ for (const auto *PI: ImpD->property_impls()) {
+ if (const ObjCPropertyDecl *P = PI->getPropertyDecl()) {
+ if (P->getGetterName() == MD->getSelector())
+ IVar = P->getPropertyIvarDecl();
+ }
}
}
diff --git a/clang/test/Analysis/properties.m b/clang/test/Analysis/properties.m
index 2f427f27518..d83b8ed14f9 100644
--- a/clang/test/Analysis/properties.m
+++ b/clang/test/Analysis/properties.m
@@ -1049,6 +1049,8 @@ void testNoCrashWhenAccessPropertyAndThereAreNoDirectBindingsAtAll() {
- (void)clearShadowedIvar;
- (NSObject *)getShadowedProp;
- (void)clearShadowedProp;
+
+@property (assign) NSObject *o2;
@end
@implementation Shadowed
@@ -1078,7 +1080,7 @@ void testNoCrashWhenAccessPropertyAndThereAreNoDirectBindingsAtAll() {
@synthesize o;
-(void)testPropertyShadowing {
- NSObject *oo = self.o;
+ NSObject *oo = self.o; // no-crash
clang_analyzer_eval(self.o == oo); // expected-warning{{TRUE}}
clang_analyzer_eval([self getShadowedIvar] == oo); // expected-warning{{UNKNOWN}}
[self clearShadowedIvar];
@@ -1086,4 +1088,10 @@ void testNoCrashWhenAccessPropertyAndThereAreNoDirectBindingsAtAll() {
clang_analyzer_eval([self getShadowedIvar] == oo); // expected-warning{{UNKNOWN}}
clang_analyzer_eval([self getShadowedIvar] == nil); // expected-warning{{TRUE}}
}
+
+@synthesize o2 = ooo2;
+
+-(void)testPropertyShadowingWithExplicitIvar {
+ NSObject *oo2 = self.o2; // no-crash
+}
@end
OpenPOWER on IntegriCloud