1
0
Эх сурвалжийг харах

cmIfCommand: Reject duplicate else() and misplaced elseif()

Closes: #14335
Gregor Jasny 8 жил өмнө
parent
commit
edac95b955

+ 20 - 0
Source/cmIfCommand.cxx

@@ -57,8 +57,19 @@ bool cmIfFunctionBlocker::IsFunctionBlocked(const cmListFileFunction& lff,
         // watch for our state change
         if (scopeDepth == 0 &&
             !cmSystemTools::Strucmp(this->Functions[c].Name.c_str(), "else")) {
+
+          if (this->ElseSeen) {
+            cmListFileBacktrace bt = mf.GetBacktrace(this->Functions[c]);
+            mf.GetCMakeInstance()->IssueMessage(
+              cmake::FATAL_ERROR,
+              "A duplicate ELSE command was found inside an IF block.", bt);
+            cmSystemTools::SetFatalErrorOccured();
+            return true;
+          }
+
           this->IsBlocking = this->HasRun;
           this->HasRun = true;
+          this->ElseSeen = true;
 
           // if trace is enabled, print a (trivially) evaluated "else"
           // statement
@@ -68,6 +79,15 @@ bool cmIfFunctionBlocker::IsFunctionBlocked(const cmListFileFunction& lff,
         } else if (scopeDepth == 0 &&
                    !cmSystemTools::Strucmp(this->Functions[c].Name.c_str(),
                                            "elseif")) {
+          if (this->ElseSeen) {
+            cmListFileBacktrace bt = mf.GetBacktrace(this->Functions[c]);
+            mf.GetCMakeInstance()->IssueMessage(
+              cmake::FATAL_ERROR,
+              "An ELSEIF command was found after an ELSE command.", bt);
+            cmSystemTools::SetFatalErrorOccured();
+            return true;
+          }
+
           if (this->HasRun) {
             this->IsBlocking = true;
           } else {

+ 2 - 0
Source/cmIfCommand.h

@@ -21,6 +21,7 @@ public:
   cmIfFunctionBlocker()
   {
     this->HasRun = false;
+    this->ElseSeen = false;
     this->ScopeDepth = 0;
   }
   ~cmIfFunctionBlocker() CM_OVERRIDE {}
@@ -32,6 +33,7 @@ public:
   std::vector<cmListFileFunction> Functions;
   bool IsBlocking;
   bool HasRun;
+  bool ElseSeen;
   unsigned int ScopeDepth;
 };
 

+ 4 - 0
Tests/RunCMake/if/RunCMakeTest.cmake

@@ -3,7 +3,11 @@ include(RunCMake)
 run_cmake(InvalidArgument1)
 run_cmake(IsDirectory)
 run_cmake(IsDirectoryLong)
+run_cmake(duplicate-deep-else)
+run_cmake(duplicate-else)
+run_cmake(duplicate-else-after-elseif)
 run_cmake(elseif-message)
+run_cmake(misplaced-elseif)
 
 run_cmake(MatchesSelf)
 

+ 1 - 0
Tests/RunCMake/if/duplicate-deep-else-result.txt

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

+ 4 - 0
Tests/RunCMake/if/duplicate-deep-else-stderr.txt

@@ -0,0 +1,4 @@
+CMake Error at duplicate-deep-else.cmake:[0-9]+ \(else\):
+  A duplicate ELSE command was found inside an IF block.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)

+ 7 - 0
Tests/RunCMake/if/duplicate-deep-else.cmake

@@ -0,0 +1,7 @@
+if(0)
+else()
+  if(0)
+  else()
+  else()
+  endif()
+endif()

+ 1 - 0
Tests/RunCMake/if/duplicate-else-after-elseif-result.txt

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

+ 4 - 0
Tests/RunCMake/if/duplicate-else-after-elseif-stderr.txt

@@ -0,0 +1,4 @@
+CMake Error at duplicate-else-after-elseif.cmake:[0-9]+ \(else\):
+  A duplicate ELSE command was found inside an IF block.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)

+ 5 - 0
Tests/RunCMake/if/duplicate-else-after-elseif.cmake

@@ -0,0 +1,5 @@
+if(0)
+elseif(0)
+else()
+else()
+endif()

+ 1 - 0
Tests/RunCMake/if/duplicate-else-result.txt

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

+ 4 - 0
Tests/RunCMake/if/duplicate-else-stderr.txt

@@ -0,0 +1,4 @@
+CMake Error at duplicate-else.cmake:[0-9]+ \(else\):
+  A duplicate ELSE command was found inside an IF block.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)

+ 4 - 0
Tests/RunCMake/if/duplicate-else.cmake

@@ -0,0 +1,4 @@
+if(0)
+else()
+else()
+endif()

+ 1 - 0
Tests/RunCMake/if/misplaced-elseif-result.txt

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

+ 4 - 0
Tests/RunCMake/if/misplaced-elseif-stderr.txt

@@ -0,0 +1,4 @@
+CMake Error at misplaced-elseif.cmake:[0-9]+ \(elseif\):
+  An ELSEIF command was found after an ELSE command.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)

+ 4 - 0
Tests/RunCMake/if/misplaced-elseif.cmake

@@ -0,0 +1,4 @@
+if(0)
+else()
+elseif(1)
+endif()