فهرست منبع

[Objective-c] Fix a crash in WeakObjectProfileTy::getBaseInfo.

The crash occurs in WeakObjectProfileTy::getBaseInfo when getBase() is
called on an ObjCPropertyRefExpr object whose receiver is an interface.
This commit fixes the crash by checking the type of the receiver and
setting IsExact to true if it is an interface.

rdar://problem/25208167

Differential Revision: http://reviews.llvm.org/D18268


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@263818 91177308-0d34-0410-b5e6-96231b3b80d8
Akira Hatanaka 9 سال پیش
والد
کامیت
1d22cda9db
2فایلهای تغییر یافته به همراه21 افزوده شده و 5 حذف شده
  1. 9 5
      lib/Sema/ScopeInfo.cpp
  2. 12 0
      test/SemaObjC/arc-repeated-weak.mm

+ 9 - 5
lib/Sema/ScopeInfo.cpp

@@ -86,11 +86,15 @@ FunctionScopeInfo::WeakObjectProfileTy::getBaseInfo(const Expr *E) {
     if (BaseProp) {
     if (BaseProp) {
       D = getBestPropertyDecl(BaseProp);
       D = getBestPropertyDecl(BaseProp);
 
 
-      const Expr *DoubleBase = BaseProp->getBase();
-      if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(DoubleBase))
-        DoubleBase = OVE->getSourceExpr();
-
-      IsExact = DoubleBase->isObjCSelfExpr();
+      if (BaseProp->isClassReceiver())
+        IsExact = true;
+      else {
+        const Expr *DoubleBase = BaseProp->getBase();
+        if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(DoubleBase))
+          DoubleBase = OVE->getSourceExpr();
+
+        IsExact = DoubleBase->isObjCSelfExpr();
+      }
     }
     }
     break;
     break;
   }
   }

+ 12 - 0
test/SemaObjC/arc-repeated-weak.mm

@@ -439,3 +439,15 @@ void doubleLevelAccessIvar(Test *a, Test *b) {
 }
 }
 @end
 @end
 
 
+// This used to crash in WeakObjectProfileTy::getBaseInfo when getBase() was
+// called on an ObjCPropertyRefExpr object whose receiver was an interface.
+
+@class NSString;
+@interface NSBundle
++(NSBundle *)foo;
+@property NSString *prop;
+@end
+
+void foo() {
+  NSString * t = NSBundle.foo.prop;
+}