Genex: Fix segfault when parsing ends with parameter expectation.

The extendResult method expects a non-empty parameters vector, as
assured by the normal case. Avoid calling the method when the parser
finds an incomplete generator expression, but has already entered
the state of expecting to find parameters.
This commit is contained in:
Stephen Kelly 2013-08-13 13:32:27 +02:00
parent 4bc8b7abab
commit 36eef302c0
3 changed files with 23 additions and 1 deletions

View File

@ -126,6 +126,9 @@ void cmGeneratorExpressionParser::ParseGeneratorExpression(
std::vector<std::vector<cmGeneratorExpressionToken>::const_iterator> std::vector<std::vector<cmGeneratorExpressionToken>::const_iterator>
commaTokens; commaTokens;
std::vector<cmGeneratorExpressionToken>::const_iterator colonToken; std::vector<cmGeneratorExpressionToken>::const_iterator colonToken;
bool emptyParamTermination = false;
if (this->it != this->Tokens.end() && if (this->it != this->Tokens.end() &&
this->it->TokenType == cmGeneratorExpressionToken::ColonSeparator) this->it->TokenType == cmGeneratorExpressionToken::ColonSeparator)
{ {
@ -133,6 +136,10 @@ void cmGeneratorExpressionParser::ParseGeneratorExpression(
parameters.resize(parameters.size() + 1); parameters.resize(parameters.size() + 1);
assert(this->it != this->Tokens.end()); assert(this->it != this->Tokens.end());
++this->it; ++this->it;
if(this->it == this->Tokens.end())
{
emptyParamTermination = true;
}
while (this->it != this->Tokens.end() && while (this->it != this->Tokens.end() &&
this->it->TokenType == cmGeneratorExpressionToken::CommaSeparator) this->it->TokenType == cmGeneratorExpressionToken::CommaSeparator)
@ -141,6 +148,10 @@ void cmGeneratorExpressionParser::ParseGeneratorExpression(
parameters.resize(parameters.size() + 1); parameters.resize(parameters.size() + 1);
assert(this->it != this->Tokens.end()); assert(this->it != this->Tokens.end());
++this->it; ++this->it;
if(this->it == this->Tokens.end())
{
emptyParamTermination = true;
}
} }
while (this->it != this->Tokens.end() && while (this->it != this->Tokens.end() &&
this->it->TokenType == cmGeneratorExpressionToken::ColonSeparator) this->it->TokenType == cmGeneratorExpressionToken::ColonSeparator)
@ -164,6 +175,10 @@ void cmGeneratorExpressionParser::ParseGeneratorExpression(
parameters.resize(parameters.size() + 1); parameters.resize(parameters.size() + 1);
assert(this->it != this->Tokens.end()); assert(this->it != this->Tokens.end());
++this->it; ++this->it;
if(this->it == this->Tokens.end())
{
emptyParamTermination = true;
}
} }
while (this->it != this->Tokens.end() && while (this->it != this->Tokens.end() &&
this->it->TokenType == cmGeneratorExpressionToken::ColonSeparator) this->it->TokenType == cmGeneratorExpressionToken::ColonSeparator)
@ -202,8 +217,11 @@ void cmGeneratorExpressionParser::ParseGeneratorExpression(
commaTokens.begin(); commaTokens.begin();
assert(parameters.size() > commaTokens.size()); assert(parameters.size() > commaTokens.size());
for ( ; pit != pend; ++pit, ++commaIt) for ( ; pit != pend; ++pit, ++commaIt)
{
if (!pit->empty() && !emptyParamTermination)
{ {
extendResult(result, *pit); extendResult(result, *pit);
}
if (commaIt != commaTokens.end()) if (commaIt != commaTokens.end())
{ {
extendText(result, *commaIt); extendText(result, *commaIt);

View File

@ -184,6 +184,8 @@ add_custom_target(check-part3 ALL
-Dtest_alias_file_exe=$<STREQUAL:$<TARGET_FILE:Alias::SomeExe>,$<TARGET_FILE:someexe>> -Dtest_alias_file_exe=$<STREQUAL:$<TARGET_FILE:Alias::SomeExe>,$<TARGET_FILE:someexe>>
-Dtest_alias_file_lib=$<STREQUAL:$<TARGET_FILE:Alias::SomeLib>,$<TARGET_FILE:empty1>> -Dtest_alias_file_lib=$<STREQUAL:$<TARGET_FILE:Alias::SomeLib>,$<TARGET_FILE:empty1>>
-Dtest_alias_target_name=$<STREQUAL:$<TARGET_PROPERTY:Alias::SomeLib,NAME>,$<TARGET_PROPERTY:empty1,NAME>> -Dtest_alias_target_name=$<STREQUAL:$<TARGET_PROPERTY:Alias::SomeLib,NAME>,$<TARGET_PROPERTY:empty1,NAME>>
-Dtest_early_termination_1=$<$<1:>:
-Dtest_early_termination_2=$<$<1:>:,
-P ${CMAKE_CURRENT_SOURCE_DIR}/check-part3.cmake -P ${CMAKE_CURRENT_SOURCE_DIR}/check-part3.cmake
COMMAND ${CMAKE_COMMAND} -E echo "check done (part 3 of 3)" COMMAND ${CMAKE_COMMAND} -E echo "check done (part 3 of 3)"
VERBATIM VERBATIM

View File

@ -24,3 +24,5 @@ endforeach()
check(test_alias_file_exe "1") check(test_alias_file_exe "1")
check(test_alias_file_lib "1") check(test_alias_file_lib "1")
check(test_alias_target_name "1") check(test_alias_target_name "1")
check(test_early_termination_1 "$<:")
check(test_early_termination_2 "$<:,")