|  | @@ -12,6 +12,8 @@
 | 
	
		
			
				|  |  |  #include <cstdlib>
 | 
	
		
			
				|  |  |  #include <iterator>
 | 
	
		
			
				|  |  |  #include <map>
 | 
	
		
			
				|  |  | +#include <sstream>
 | 
	
		
			
				|  |  | +#include <stdexcept>
 | 
	
		
			
				|  |  |  #include <utility>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #include <cm/memory>
 | 
	
	
		
			
				|  | @@ -354,6 +356,21 @@ bool HandleInMode(std::vector<std::string> const& args,
 | 
	
		
			
				|  |  |    return true;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +bool TryParseInteger(cmExecutionStatus& status, const std::string& str, int& i)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +  try {
 | 
	
		
			
				|  |  | +    i = std::stoi(str);
 | 
	
		
			
				|  |  | +  } catch (std::invalid_argument&) {
 | 
	
		
			
				|  |  | +    std::ostringstream e;
 | 
	
		
			
				|  |  | +    e << "Invalid integer: '" << str << "'";
 | 
	
		
			
				|  |  | +    status.SetError(e.str());
 | 
	
		
			
				|  |  | +    cmSystemTools::SetFatalErrorOccured();
 | 
	
		
			
				|  |  | +    return false;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  return true;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  } // anonymous namespace
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  bool cmForEachCommand(std::vector<std::string> const& args,
 | 
	
	
		
			
				|  | @@ -376,16 +393,28 @@ bool cmForEachCommand(std::vector<std::string> const& args,
 | 
	
		
			
				|  |  |        int stop = 0;
 | 
	
		
			
				|  |  |        int step = 0;
 | 
	
		
			
				|  |  |        if (args.size() == 3) {
 | 
	
		
			
				|  |  | -        stop = std::stoi(args[2]);
 | 
	
		
			
				|  |  | +        if (!TryParseInteger(status, args[2], stop)) {
 | 
	
		
			
				|  |  | +          return false;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        if (args.size() == 4) {
 | 
	
		
			
				|  |  | -        start = std::stoi(args[2]);
 | 
	
		
			
				|  |  | -        stop = std::stoi(args[3]);
 | 
	
		
			
				|  |  | +        if (!TryParseInteger(status, args[2], start)) {
 | 
	
		
			
				|  |  | +          return false;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (!TryParseInteger(status, args[3], stop)) {
 | 
	
		
			
				|  |  | +          return false;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        if (args.size() == 5) {
 | 
	
		
			
				|  |  | -        start = std::stoi(args[2]);
 | 
	
		
			
				|  |  | -        stop = std::stoi(args[3]);
 | 
	
		
			
				|  |  | -        step = std::stoi(args[4]);
 | 
	
		
			
				|  |  | +        if (!TryParseInteger(status, args[2], start)) {
 | 
	
		
			
				|  |  | +          return false;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (!TryParseInteger(status, args[3], stop)) {
 | 
	
		
			
				|  |  | +          return false;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (!TryParseInteger(status, args[4], step)) {
 | 
	
		
			
				|  |  | +          return false;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        if (step == 0) {
 | 
	
		
			
				|  |  |          if (start > stop) {
 |