Browse Source

GenEx: Parse comma after colon tokens specially

Otherwise the comma is treated as plain text by ParseContent.

$<STREQUAL:,> should be valid and true.
$<STREQUAL:,something> should be valid and false.

$<STREQUAL:,,> should be non-valid as it is 3 parameters.
$<STREQUAL:something,,> should be non-valid as it is 3 parameters.

Additionally, this allows reporting the correct error for other
expressions. For example $<TARGET_PROPERTY:,> should be invalid
because it has an empty target and empty property. It shouldn't
attempt to read the property ',' on the 'implicit this' target.
Stephen Kelly 13 years ago
parent
commit
b3d8f5dab7

+ 7 - 1
Source/cmGeneratorExpressionParser.cxx

@@ -118,10 +118,16 @@ void cmGeneratorExpressionParser::ParseGeneratorExpression(
     colonToken = this->it;
     parameters.resize(parameters.size() + 1);
     ++this->it;
+    while (this->it->TokenType == cmGeneratorExpressionToken::CommaSeparator)
+      {
+      commaTokens.push_back(this->it);
+      parameters.resize(parameters.size() + 1);
+      ++this->it;
+      }
     while(this->it->TokenType != cmGeneratorExpressionToken::EndExpression)
       {
       this->ParseContent(*(parameters.end() - 1));
-      if (this->it->TokenType == cmGeneratorExpressionToken::CommaSeparator)
+      while (this->it->TokenType == cmGeneratorExpressionToken::CommaSeparator)
         {
         commaTokens.push_back(this->it);
         parameters.resize(parameters.size() + 1);

+ 2 - 0
Tests/GeneratorExpression/CMakeLists.txt

@@ -37,6 +37,8 @@ add_custom_target(check ALL
     -Dtest_strequal_angle_r=$<STREQUAL:$<ANGLE-R>,$<ANGLE-R>>
     -Dtest_strequal_comma=$<STREQUAL:$<COMMA>,$<COMMA>>
     -Dtest_strequal_angle_r_comma=$<STREQUAL:$<ANGLE-R>,$<COMMA>>
+    -Dtest_strequal_both_empty=$<STREQUAL:,>
+    -Dtest_strequal_one_empty=$<STREQUAL:something,>
     -Dtest_angle_r=$<ANGLE-R>
     -Dtest_comma=$<COMMA>
     -P ${CMAKE_CURRENT_SOURCE_DIR}/check.cmake

+ 2 - 0
Tests/GeneratorExpression/check.cmake

@@ -38,5 +38,7 @@ check(test_strequal_no_yes "0")
 check(test_strequal_angle_r "1")
 check(test_strequal_comma "1")
 check(test_strequal_angle_r_comma "0")
+check(test_strequal_both_empty "1")
+check(test_strequal_one_empty "0")
 check(test_angle_r ">")
 check(test_comma ",")

+ 1 - 1
Tests/RunCMake/GeneratorExpression/BadNOT-stderr.txt

@@ -20,7 +20,7 @@ CMake Error at BadNOT.cmake:1 \(add_custom_target\):
 
     \$<NOT:,>
 
-  \$<NOT> parameter must resolve to exactly one '0' or '1' value.
+  \$<NOT> expression requires exactly one parameter.
 Call Stack \(most recent call first\):
   CMakeLists.txt:3 \(include\)
 +

+ 1 - 0
Tests/RunCMake/GeneratorExpression/BadStrEqual-result.txt

@@ -0,0 +1 @@
+1

+ 38 - 0
Tests/RunCMake/GeneratorExpression/BadStrEqual-stderr.txt

@@ -0,0 +1,38 @@
+CMake Error at BadStrEqual.cmake:1 \(add_custom_target\):
+  Error evaluating generator expression:
+
+    \$<STREQUAL>
+
+  \$<STREQUAL> expression requires 2 comma separated parameters, but got 0
+  instead.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)
++CMake Error at BadStrEqual.cmake:1 \(add_custom_target\):
+  Error evaluating generator expression:
+
+    \$<STREQUAL:>
+
+  \$<STREQUAL> expression requires 2 comma separated parameters, but got 1
+  instead.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)
++
+CMake Error at BadStrEqual.cmake:1 \(add_custom_target\):
+  Error evaluating generator expression:
+
+    \$<STREQUAL:,,>
+
+  \$<STREQUAL> expression requires 2 comma separated parameters, but got 3
+  instead.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)
++
+CMake Error at BadStrEqual.cmake:1 \(add_custom_target\):
+  Error evaluating generator expression:
+
+    \$<STREQUAL:something,,>
+
+  \$<STREQUAL> expression requires 2 comma separated parameters, but got 3
+  instead.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)$

+ 6 - 0
Tests/RunCMake/GeneratorExpression/BadStrEqual.cmake

@@ -0,0 +1,6 @@
+add_custom_target(check ALL COMMAND check
+  $<STREQUAL>
+  $<STREQUAL:>
+  $<STREQUAL:,,>
+  $<STREQUAL:something,,>
+  VERBATIM)

+ 1 - 0
Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake

@@ -4,3 +4,4 @@ run_cmake(BadCONFIG)
 run_cmake(BadOR)
 run_cmake(BadAND)
 run_cmake(BadNOT)
+run_cmake(BadStrEqual)