@@ -62,36 +62,34 @@ void LifetimeTracker::InsertDtorCall(const VarDecl* vd, OutputFormatHelper& ofm)
6262 return ;
6363 }
6464
65- auto * dtorDecl = type->getAsCXXRecordDecl ()->getDestructor ();
66- auto * ic = CastLToRValue (vd);
65+ auto * dtorDecl = type->getAsCXXRecordDecl ()->getDestructor ();
66+ auto * ic = CastLToRValue (vd);
67+ CodeGeneratorVariant cg{ofm};
68+
69+ auto insertDtor = [&](Expr* member) {
70+ auto * mem = AccessMember (member, dtorDecl, vd->getType ()->isPointerType ());
71+ cg->InsertArg (CallMemberFun (mem, dtorDecl->getType ()));
72+ ofm.AppendSemiNewLine ();
73+ };
6774
6875 if (const auto * ar = dyn_cast_or_null<ConstantArrayType>(vd->getType ()); ar and not GetInsightsOptions ().UseShow2C ) {
6976 // not nice but call the destructor for each array element
7077 for (const auto & i : NumberIterator{GetSize (ar)}) {
71- auto * mem = AccessMember (ArraySubscript (ic, i, type), dtorDecl, vd->getType ()->isPointerType ());
72- auto * callDtor = CallMemberFun (mem, dtorDecl->getType ());
73-
74- CodeGeneratorVariant cg{ofm};
75- cg->InsertArg (callDtor);
76- ofm.AppendSemiNewLine ();
78+ insertDtor (ArraySubscript (ic, i, type));
7779 }
7880
7981 return ;
8082 }
8183
82- auto * mem = AccessMember (ic, dtorDecl, vd->getType ()->isPointerType ());
83- auto * callDtor = CallMemberFun (mem, dtorDecl->getType ());
84-
85- CodeGeneratorVariant cg{ofm};
86- cg->InsertArg (callDtor);
87-
88- ofm.AppendSemiNewLine ();
84+ insertDtor (ic);
8985}
9086// -----------------------------------------------------------------------------
9187
92- void LifetimeTracker::Return (OutputFormatHelper& ofm)
88+ bool LifetimeTracker::Return (OutputFormatHelper& ofm)
9389{
94- RETURN_IF (not GetInsightsOptions ().ShowLifetime or objects.empty ())
90+ RETURN_FALSE_IF (not GetInsightsOptions ().ShowLifetime or objects.empty ())
91+
92+ bool ret{};
9593
9694 for (OnceTrue needsSemi{}; auto & e : llvm::reverse (objects)) {
9795 if (LifetimeEntry::FuncStart::Yes == e.funcStart ) {
@@ -108,7 +106,10 @@ void LifetimeTracker::Return(OutputFormatHelper& ofm)
108106 }
109107
110108 InsertDtorCall (e.item , ofm);
109+ ret = true ;
111110 }
111+
112+ return ret;
112113}
113114// -----------------------------------------------------------------------------
114115
@@ -123,9 +124,11 @@ void LifetimeTracker::removeTop()
123124}
124125// -----------------------------------------------------------------------------
125126
126- void LifetimeTracker::EndScope (OutputFormatHelper& ofm, bool coveredByReturn)
127+ bool LifetimeTracker::EndScope (OutputFormatHelper& ofm, bool coveredByReturn)
127128{
128- RETURN_IF (not GetInsightsOptions ().ShowLifetime or objects.empty ())
129+ RETURN_FALSE_IF (not GetInsightsOptions ().ShowLifetime or objects.empty ())
130+
131+ bool ret{};
129132
130133 if (not coveredByReturn) {
131134 for (auto & e : llvm::reverse (objects)) {
@@ -138,10 +141,13 @@ void LifetimeTracker::EndScope(OutputFormatHelper& ofm, bool coveredByReturn)
138141 }
139142
140143 InsertDtorCall (e.item , ofm);
144+ ret = true ;
141145 }
142146 }
143147
144148 removeTop ();
149+
150+ return ret;
145151}
146152// -----------------------------------------------------------------------------
147153
0 commit comments