<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">The error is indeed strange.<div class="">The body is declared as</div><div class=""><br class=""></div><div class=""><div class="">  LazyDeclStmtPtr Body;</div></div><div class=""><br class=""></div><div class="">where</div><div class=""><br class=""></div><div class=""><div class="">using LazyDeclStmtPtr =</div><div class="">    LazyOffsetPtr<Stmt, uint64_t, &ExternalASTSource::GetExternalDeclStmt>;</div></div><div class=""><br class=""></div><div class="">where</div><div class=""><br class=""></div><div class=""><div class="">template<typename T, typename OffsT, T* (ExternalASTSource::*Get)(OffsT Offset)></div><div class="">struct LazyOffsetPtr {</div><div class="">  mutable uint64_t Ptr = 0;</div></div><div class="">(…)</div><div class=""><div class="">  explicit operator bool() const { return Ptr != 0; }</div></div><div class="">(…)</div><div class="">}</div><div class=""><br class=""></div><div class="">so it does not seem like it can be uninitialized.</div><div class="">Sadly on macOS I don’t have either valgrind or msan,</div><div class="">so I can’t reproduce the failure.</div><div class="">Do you think you could debug further?</div><div class="">Is “Body” indeed uninitialized at use time? (e.g. if you print it..)</div><div class="">A stacktrace from a debug build should be helpful.</div><div class=""><br class=""></div><div class="">Thanks,</div><div class="">George</div><div class=""><div class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Nov 26, 2018, at 12:03 AM, Mikael Holmén <<a href="mailto:mikael.holmen@ericsson.com" class="">mikael.holmen@ericsson.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Hi again,</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Do you have any opinion about the below valgrind complaint that starts<span class="Apple-converted-space"> </span></span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">appearing with this patch?</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">valgrind still complains on it on current trunk.</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">I see it when compiling with clang 3.6.0. I've also tried gcc 5.4.0 but<span class="Apple-converted-space"> </span></span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">then I don't get it.</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Regards,</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Mikael</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">On 11/21/18 8:33 AM, Mikael Holmén via cfe-commits wrote:</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">Hi George,<br class=""><br class="">I noticed that valgrind started complaining in one case with this patch.<br class=""><br class="">I've no idea if it's really due to something in the patch or if it's<br class="">something old that surfaced or if it's a false flag.<br class=""><br class="">Anyway, with this patch the following<br class=""><br class="">  valgrind clang-tidy -checks='-*,clang-analyzer-*' 'memcpy.c' -- -O0<br class=""><br class="">gives me<br class=""><br class="">==18829== Memcheck, a memory error detector<br class="">==18829== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.<br class="">==18829== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info<br class="">==18829== Command: build-all/bin/clang-tidy -checks=-*,clang-analyzer-*<br class="">memcpy.c -- -O0<br class="">==18829==<br class="">==18829== Conditional jump or move depends on uninitialised value(s)<br class="">==18829==    at 0xE580DF:<br class="">clang::ento::RetainSummaryManager::canEval(clang::CallExpr const*,<br class="">clang::FunctionDecl const*, bool&) (in<br class="">/data/repo/llvm-patch/build-all/bin/clang-tidy)<br class="">==18829==    by 0xD034AA:<br class="">clang::ento::retaincountchecker::RetainCountChecker::evalCall(clang::CallExpr<br class="">const*, clang::ento::CheckerContext&) const (in<br class="">/data/repo/llvm-patch/build-all/bin/clang-tidy)<br class="">==18829==    by 0xDCBCD7:<br class="">clang::ento::CheckerManager::runCheckersForEvalCall(clang::ento::ExplodedNodeSet&,<br class="">clang::ento::ExplodedNodeSet const&, clang::ento::CallEvent const&,<br class="">clang::ento::ExprEngine&) (in<br class="">/data/repo/llvm-patch/build-all/bin/clang-tidy)<br class="">==18829==    by 0xE033D5:<br class="">clang::ento::ExprEngine::evalCall(clang::ento::ExplodedNodeSet&,<br class="">clang::ento::ExplodedNode*, clang::ento::CallEvent const&) (in<br class="">/data/repo/llvm-patch/build-all/bin/clang-tidy)<br class="">==18829==    by 0xE03165:<br class="">clang::ento::ExprEngine::VisitCallExpr(clang::CallExpr const*,<br class="">clang::ento::ExplodedNode*, clang::ento::ExplodedNodeSet&) (in<br class="">/data/repo/llvm-patch/build-all/bin/clang-tidy)<br class="">==18829==    by 0xDE3D9A: clang::ento::ExprEngine::Visit(clang::Stmt<br class="">const*, clang::ento::ExplodedNode*, clang::ento::ExplodedNodeSet&) (in<br class="">/data/repo/llvm-patch/build-all/bin/clang-tidy)<br class="">==18829==    by 0xDDEFD1:<br class="">clang::ento::ExprEngine::ProcessStmt(clang::Stmt const*,<br class="">clang::ento::ExplodedNode*) (in<br class="">/data/repo/llvm-patch/build-all/bin/clang-tidy)<br class="">==18829==    by 0xDDEBBC:<br class="">clang::ento::ExprEngine::processCFGElement(clang::CFGElement,<br class="">clang::ento::ExplodedNode*, unsigned int,<br class="">clang::ento::NodeBuilderContext*) (in<br class="">/data/repo/llvm-patch/build-all/bin/clang-tidy)<br class="">==18829==    by 0xDD3154:<br class="">clang::ento::CoreEngine::HandlePostStmt(clang::CFGBlock const*, unsigned<br class="">int, clang::ento::ExplodedNode*) (in<br class="">/data/repo/llvm-patch/build-all/bin/clang-tidy)<br class="">==18829==    by 0xDD24D3:<br class="">clang::ento::CoreEngine::ExecuteWorkList(clang::LocationContext const*,<br class="">unsigned int, llvm::IntrusiveRefCntPtr<clang::ento::ProgramState const>)<br class="">(in /data/repo/llvm-patch/build-all/bin/clang-tidy)<br class="">==18829==    by 0xB8E90E: (anonymous<br class="">namespace)::AnalysisConsumer::HandleCode(clang::Decl*, unsigned int,<br class="">clang::ento::ExprEngine::InliningModes, llvm::DenseSet<clang::Decl<br class="">const*, llvm::DenseMapInfo<clang::Decl const*> >*) (in<br class="">/data/repo/llvm-patch/build-all/bin/clang-tidy)<br class="">==18829==    by 0xB89943: (anonymous<br class="">namespace)::AnalysisConsumer::HandleTranslationUnit(clang::ASTContext&)<br class="">(in /data/repo/llvm-patch/build-all/bin/clang-tidy)<br class="">==18829==<br class=""><br class="">The call to<br class=""><br class="">     const FunctionDecl* FDD = FD->getDefinition();<br class=""><br class="">in RetainSummaryManager::canEval eventually ends up in<br class=""><br class="">   bool isThisDeclarationADefinition() const {<br class="">     return isDeletedAsWritten() || isDefaulted() || Body ||<br class="">hasSkippedBody() ||<br class="">            isLateTemplateParsed() || willHaveBody() || hasDefiningAttr();<br class="">   }<br class=""><br class="">And here it seems to be the access of "Body" that valgrind complains on.<br class="">If I simply comment out "Body" the complaint is gone.<br class=""><br class="">I really have no clue about this code, but perhaps this makes some sense<br class="">to you? Or perhaps to someone else?<br class=""><br class="">Regards,<br class="">Mikael<br class=""><br class="">On 10/24/18 1:11 AM, George Karpenkov via cfe-commits wrote:<br class=""><blockquote type="cite" class="">Author: george.karpenkov<br class="">Date: Tue Oct 23 16:11:30 2018<br class="">New Revision: 345099<br class=""><br class="">URL: <a href="http://llvm.org/viewvc/llvm-project?rev=345099&view=rev" class="">http://llvm.org/viewvc/llvm-project?rev=345099&view=rev</a><br class="">Log:<br class="">[analyzer] Trust summaries for OSObject::retain and OSObject::release<br class=""><br class="">Refactor the way in which summaries are consumed for safeMetaCast<br class=""><br class="">Differential Revision: <a href="https://reviews.llvm.org/D53549" class="">https://reviews.llvm.org/D53549</a><br class=""><br class="">Modified:<br class="">     cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp<br class="">     cfe/trunk/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp<br class="">     cfe/trunk/test/Analysis/osobject-retain-release.cpp<br class=""><br class="">Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp?rev=345099&r1=345098&r2=345099&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp?rev=345099&r1=345098&r2=345099&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp (original)<br class="">+++ cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountChecker.cpp Tue Oct 23 16:11:30 2018<br class="">@@ -776,31 +776,27 @@ bool RetainCountChecker::evalCall(const<br class=""><br class="">    const LocationContext *LCtx = C.getLocationContext();<br class=""><br class="">-  // Process OSDynamicCast: should just return the first argument.<br class="">-  // For now, tresting the cast as a no-op, and disregarding the case where<br class="">-  // the output becomes null due to the type mismatch.<br class="">-  if (FD->getNameAsString() == "safeMetaCast") {<br class="">-    state = state->BindExpr(CE, LCtx,<br class="">-                            state->getSVal(CE->getArg(0), LCtx));<br class="">-    C.addTransition(state);<br class="">-    return true;<br class="">-  }<br class="">-<br class="">    // See if it's one of the specific functions we know how to eval.<br class="">    if (!SmrMgr.canEval(CE, FD, hasTrustedImplementationAnnotation))<br class="">      return false;<br class=""><br class="">    // Bind the return value.<br class="">-  SVal RetVal = state->getSVal(CE->getArg(0), LCtx);<br class="">-  if (RetVal.isUnknown() ||<br class="">-      (hasTrustedImplementationAnnotation && !ResultTy.isNull())) {<br class="">+  // For now, all the functions which we can evaluate and which take<br class="">+  // at least one argument are identities.<br class="">+  if (CE->getNumArgs() >= 1) {<br class="">+    SVal RetVal = state->getSVal(CE->getArg(0), LCtx);<br class="">+<br class="">      // If the receiver is unknown or the function has<br class="">      // 'rc_ownership_trusted_implementation' annotate attribute, conjure a<br class="">      // return value.<br class="">-    SValBuilder &SVB = C.getSValBuilder();<br class="">-    RetVal = SVB.conjureSymbolVal(nullptr, CE, LCtx, ResultTy, C.blockCount());<br class="">+    if (RetVal.isUnknown() ||<br class="">+        (hasTrustedImplementationAnnotation && !ResultTy.isNull())) {<br class="">+      SValBuilder &SVB = C.getSValBuilder();<br class="">+      RetVal =<br class="">+          SVB.conjureSymbolVal(nullptr, CE, LCtx, ResultTy, C.blockCount());<br class="">+    }<br class="">+    state = state->BindExpr(CE, LCtx, RetVal, false);<br class="">    }<br class="">-  state = state->BindExpr(CE, LCtx, RetVal, false);<br class=""><br class="">    C.addTransition(state);<br class="">    return true;<br class=""><br class="">Modified: cfe/trunk/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp?rev=345099&r1=345098&r2=345099&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp?rev=345099&r1=345098&r2=345099&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp (original)<br class="">+++ cfe/trunk/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp Tue Oct 23 16:11:30 2018<br class="">@@ -102,9 +102,6 @@ RetainSummaryManager::generateSummary(co<br class="">      return getPersistentStopSummary();<br class="">    }<br class=""><br class="">-  // [PR 3337] Use 'getAs<FunctionType>' to strip away any typedefs on the<br class="">-  // function's type.<br class="">-  const FunctionType *FT = FD->getType()->getAs<FunctionType>();<br class="">    const IdentifierInfo *II = FD->getIdentifier();<br class="">    if (!II)<br class="">      return getDefaultSummary();<br class="">@@ -115,7 +112,8 @@ RetainSummaryManager::generateSummary(co<br class="">    // down below.<br class="">    FName = FName.substr(FName.find_first_not_of('_'));<br class=""><br class="">-  // Inspect the result type.<br class="">+  // Inspect the result type. Strip away any typedefs.<br class="">+  const auto *FT = FD->getType()->getAs<FunctionType>();<br class="">    QualType RetTy = FT->getReturnType();<br class="">    std::string RetTyName = RetTy.getAsString();<br class=""><br class="">@@ -506,12 +504,6 @@ bool RetainSummaryManager::isTrustedRefe<br class="">  bool RetainSummaryManager::canEval(const CallExpr *CE,<br class="">                                     const FunctionDecl *FD,<br class="">                                     bool &hasTrustedImplementationAnnotation) {<br class="">-  // For now, we're only handling the functions that return aliases of their<br class="">-  // arguments: CFRetain (and its families).<br class="">-  // Eventually we should add other functions we can model entirely,<br class="">-  // such as CFRelease, which don't invalidate their arguments or globals.<br class="">-  if (CE->getNumArgs() != 1)<br class="">-    return false;<br class=""><br class="">    IdentifierInfo *II = FD->getIdentifier();<br class="">    if (!II)<br class="">@@ -533,6 +525,13 @@ bool RetainSummaryManager::canEval(const<br class="">        return isRetain(FD, FName) || isAutorelease(FD, FName) ||<br class="">               isMakeCollectable(FName);<br class=""><br class="">+    // Process OSDynamicCast: should just return the first argument.<br class="">+    // For now, treating the cast as a no-op, and disregarding the case where<br class="">+    // the output becomes null due to the type mismatch.<br class="">+    if (TrackOSObjects && FName == "safeMetaCast") {<br class="">+      return true;<br class="">+    }<br class="">+<br class="">      const FunctionDecl* FDD = FD->getDefinition();<br class="">      if (FDD && isTrustedReferenceCountImplementation(FDD)) {<br class="">        hasTrustedImplementationAnnotation = true;<br class="">@@ -540,6 +539,12 @@ bool RetainSummaryManager::canEval(const<br class="">      }<br class="">    }<br class=""><br class="">+  if (const auto *MD = dyn_cast<CXXMethodDecl>(FD)) {<br class="">+    const CXXRecordDecl *Parent = MD->getParent();<br class="">+    if (TrackOSObjects && Parent && isOSObjectSubclass(Parent))<br class="">+      return FName == "release" || FName == "retain";<br class="">+  }<br class="">+<br class="">    return false;<br class=""><br class="">  }<br class=""><br class="">Modified: cfe/trunk/test/Analysis/osobject-retain-release.cpp<br class="">URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/osobject-retain-release.cpp?rev=345099&r1=345098&r2=345099&view=diff" class="">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/osobject-retain-release.cpp?rev=345099&r1=345098&r2=345099&view=diff</a><br class="">==============================================================================<br class="">--- cfe/trunk/test/Analysis/osobject-retain-release.cpp (original)<br class="">+++ cfe/trunk/test/Analysis/osobject-retain-release.cpp Tue Oct 23 16:11:30 2018<br class="">@@ -9,7 +9,7 @@ struct OSMetaClass;<br class=""><br class="">  struct OSObject {<br class="">    virtual void retain();<br class="">-  virtual void release();<br class="">+  virtual void release() {};<br class="">    virtual ~OSObject(){}<br class=""><br class="">    static OSObject *generateObject(int);<br class=""><br class=""><br class="">_______________________________________________<br class="">cfe-commits mailing list<br class=""><a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a><br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits<br class=""><br class=""><br class="">_______________________________________________<br class="">cfe-commits mailing list<br class=""><a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a><br class=""><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br class=""></blockquote></blockquote><span id="cid:F153CAF0DD05C84CA2E31F71C586D582@eurprd07.prod.outlook.com"><memcpy.c></span></div></blockquote></div><br class=""></div></div></body></html>