Merge topic 'set-CACHE-diagnostics'

20c23518d9 set: Improve diagnostics for CACHE mode

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: buildbot <buildbot@kitware.com>
Merge-request: !8679
diff --git a/Source/cmSetCommand.cxx b/Source/cmSetCommand.cxx
index c4bb949..c98745a 100644
--- a/Source/cmSetCommand.cxx
+++ b/Source/cmSetCommand.cxx
@@ -115,10 +115,18 @@
   // we should be nice and try to catch some simple screwups if the last or
   // next to last args are CACHE then they screwed up.  If they used FORCE
   // without CACHE they screwed up
-  if ((args.back() == "CACHE") ||
-      (args.size() > 1 && args[args.size() - 2] == "CACHE") ||
-      (force && !cache)) {
-    status.SetError("given invalid arguments for CACHE mode.");
+  if (args.back() == "CACHE") {
+    status.SetError(
+      "given invalid arguments for CACHE mode: missing type and docstring");
+    return false;
+  }
+  if (args.size() > 1 && args[args.size() - 2] == "CACHE") {
+    status.SetError(
+      "given invalid arguments for CACHE mode: missing type or docstring");
+    return false;
+  }
+  if (force && !cache) {
+    status.SetError("given invalid arguments: FORCE specified without CACHE");
     return false;
   }
 
diff --git a/Tests/RunCMake/set/CacheErrors-result.txt b/Tests/RunCMake/set/CacheErrors-result.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/Tests/RunCMake/set/CacheErrors-result.txt
@@ -0,0 +1 @@
+1
diff --git a/Tests/RunCMake/set/CacheErrors-stderr.txt b/Tests/RunCMake/set/CacheErrors-stderr.txt
new file mode 100644
index 0000000..9983160
--- /dev/null
+++ b/Tests/RunCMake/set/CacheErrors-stderr.txt
@@ -0,0 +1,19 @@
+^CMake Error at CacheErrors\.cmake:1 \(set\):
+  set given invalid arguments for CACHE mode: missing type and docstring
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)
++
+CMake Error at CacheErrors\.cmake:2 \(set\):
+  set given invalid arguments for CACHE mode: missing type or docstring
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)
++
+CMake Error at CacheErrors\.cmake:3 \(set\):
+  set given invalid arguments for CACHE mode: missing type or docstring
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)
++
+CMake Error at CacheErrors\.cmake:4 \(set\):
+  set given invalid arguments: FORCE specified without CACHE
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)$
diff --git a/Tests/RunCMake/set/CacheErrors.cmake b/Tests/RunCMake/set/CacheErrors.cmake
new file mode 100644
index 0000000..d177474
--- /dev/null
+++ b/Tests/RunCMake/set/CacheErrors.cmake
@@ -0,0 +1,4 @@
+set (var val CACHE)
+set (var val CACHE STRING)
+set (var val CACHE "")
+set (var val CACH3 STRING "" FORCE)
diff --git a/Tests/RunCMake/set/RunCMakeTest.cmake b/Tests/RunCMake/set/RunCMakeTest.cmake
index b3bd0a4..c785450 100644
--- a/Tests/RunCMake/set/RunCMakeTest.cmake
+++ b/Tests/RunCMake/set/RunCMakeTest.cmake
@@ -1,5 +1,6 @@
 include(RunCMake)
 
+run_cmake(CacheErrors)
 run_cmake(ParentScope)
 run_cmake(ParentPulling)
 run_cmake(ParentPullingRecursive)