diff options
| -rw-r--r-- | clang/include/clang/StaticAnalyzer/Core/RetainSummaryManager.h | 2 | ||||
| -rw-r--r-- | clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp | 6 | ||||
| -rw-r--r-- | clang/test/Analysis/osobject-retain-release.cpp | 7 | 
3 files changed, 13 insertions, 2 deletions
diff --git a/clang/include/clang/StaticAnalyzer/Core/RetainSummaryManager.h b/clang/include/clang/StaticAnalyzer/Core/RetainSummaryManager.h index 486e2aca84a..9b71011a54d 100644 --- a/clang/include/clang/StaticAnalyzer/Core/RetainSummaryManager.h +++ b/clang/include/clang/StaticAnalyzer/Core/RetainSummaryManager.h @@ -139,7 +139,7 @@ public:      OwnedWhenTrackedReceiver,      // Treat this function as returning a non-tracked symbol even if      // the function has been inlined. This is used where the call -    // site summary is more presise than the summary indirectly produced +    // site summary is more precise than the summary indirectly produced      // by inlining the function      NoRetHard    }; diff --git a/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp b/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp index 1a2dc28a571..efaab64c770 100644 --- a/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp @@ -478,8 +478,12 @@ RetainSummaryManager::getSummary(const CallEvent &Call,      Summ = getFunctionSummary(cast<CXXMemberCall>(Call).getDecl());      break;    case CE_CXXMemberOperator: -  case CE_Block: +    Summ = getFunctionSummary(cast<CXXMemberOperatorCall>(Call).getDecl()); +    break;    case CE_CXXConstructor: +    Summ = getFunctionSummary(cast<CXXConstructorCall>(Call).getDecl()); +    break; +  case CE_Block:    case CE_CXXDestructor:    case CE_CXXAllocator:      // FIXME: These calls are currently unsupported. diff --git a/clang/test/Analysis/osobject-retain-release.cpp b/clang/test/Analysis/osobject-retain-release.cpp index 4e26c03bc26..17360ac3220 100644 --- a/clang/test/Analysis/osobject-retain-release.cpp +++ b/clang/test/Analysis/osobject-retain-release.cpp @@ -43,6 +43,7 @@ struct OSArray : public OSObject {  struct OtherStruct {    static void doNothingToArray(OSArray *array); +  OtherStruct(OSArray *arr);  };  struct OSMetaClassBase { @@ -55,6 +56,12 @@ void check_no_invalidation() {  } // expected-warning{{Potential leak of an object stored into 'arr'}}    // expected-note@-1{{Object leaked}} +void check_no_invalidation_other_struct() { +  OSArray *arr = OSArray::withCapacity(10); // expected-note{{Call to function 'withCapacity' returns an OSObject of type struct OSArray * with a +1 retain count}} +  OtherStruct other(arr); // expected-warning{{Potential leak}} +                          // expected-note@-1{{Object leaked}} +} +  void check_rc_consumed() {    OSArray *arr = OSArray::withCapacity(10);    OSArray::consumeArray(arr);  | 

