From 921d74d8559daf6fbef7d78e582029f6acb04f6e Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sat, 16 May 2015 06:52:30 +0200 Subject: [PATCH] AutoGen: Don't iterate over a container while populating it. The InitializeAutogenTarget creates new targets and adds them to the Targets container on the makefile. In this method, we have a reference to that container and we are iterating over it. That happens to work with hash_map, but it fails with undefined behavior when using the std::unordered_map from libstdc++-4.9 (and likely others). --- Source/cmGlobalGenerator.cxx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 1c9c475ff..82023e498 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -1373,10 +1373,18 @@ void cmGlobalGenerator::CreateQtAutoGeneratorsTargets(AutogensType &autogens) { cmTargets& targets = this->LocalGenerators[i]->GetMakefile()->GetTargets(); + std::vector targetNames; + targetNames.reserve(targets.size()); for(cmTargets::iterator ti = targets.begin(); ti != targets.end(); ++ti) { - cmTarget& target = ti->second; + targetNames.push_back(ti->second.GetName()); + } + for(std::vector::iterator ti = targetNames.begin(); + ti != targetNames.end(); ++ti) + { + cmTarget& target = *this->LocalGenerators[i] + ->GetMakefile()->FindTarget(*ti, true); if(target.GetType() == cmTarget::EXECUTABLE || target.GetType() == cmTarget::STATIC_LIBRARY || target.GetType() == cmTarget::SHARED_LIBRARY ||