From 9c161e894af3dd7f54dd29218a476bc270864d24 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Thu, 10 Aug 2017 03:05:21 +0000 Subject: [PATCH] [LCG] Fix an assert in a on-scope-exit lambda that checked the contents of the returned value. Checking the returned value from inside of a scoped exit isn't actually valid. It happens to work when NRVO fires and the stars align, which they reliably do with Clang but don't, for example, on MSVC builds. llvm-svn: 310547 --- llvm/lib/Analysis/LazyCallGraph.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/llvm/lib/Analysis/LazyCallGraph.cpp b/llvm/lib/Analysis/LazyCallGraph.cpp index b658fed..5aeea9e 100644 --- a/llvm/lib/Analysis/LazyCallGraph.cpp +++ b/llvm/lib/Analysis/LazyCallGraph.cpp @@ -1105,14 +1105,10 @@ LazyCallGraph::RefSCC::removeInternalRefEdge(Node &SourceN, // or we return new RefSCCs and this RefSCC is dead. verify(); auto VerifyOnExit = make_scope_exit([&]() { - if (Result.empty()) { + // If we didn't replace our RefSCC with new ones, check that this one + // remains valid. + if (G) verify(); - } else { - assert(!G && "A dead RefSCC should have its graph pointer nulled."); - assert(SCCs.empty() && "A dead RefSCC should have no SCCs in it."); - for (RefSCC *RC : Result) - RC->verify(); - } }); #endif @@ -1325,6 +1321,12 @@ LazyCallGraph::RefSCC::removeInternalRefEdge(Node &SourceN, SCCs.clear(); SCCIndices.clear(); +#ifndef NDEBUG + // Verify the new RefSCCs we've built. + for (RefSCC *RC : Result) + RC->verify(); +#endif + // Return the new list of SCCs. return Result; } -- 2.7.4