From 947f0c8b811a2f5b0681590b449125e07a74ae0f Mon Sep 17 00:00:00 2001
From: Brad King <brad.king@kitware.com>
Date: Wed, 16 Jun 2021 10:56:15 -0400
Subject: [PATCH] VS: Do not apply '/external:W*' flag table mapping on VS <
 16.10

Since commit 9054cd05e6 (VS: Add flag table entries for '/external:W*'
flags in VS 16.10, 2021-05-28, v3.20.4~10^2) we map flags to the
`ExternalWarningLevel` element.  VS 16.9 does not support that element,
but its `cl` compiler does support the `/external:W*` flags.  Filter out
the flag table entry on older VS versions.

Fixes: #22308
---
 Source/cmGlobalVisualStudio10Generator.cxx | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/Source/cmGlobalVisualStudio10Generator.cxx b/Source/cmGlobalVisualStudio10Generator.cxx
index 596c73120fc..b911eef40b3 100644
--- a/Source/cmGlobalVisualStudio10Generator.cxx
+++ b/Source/cmGlobalVisualStudio10Generator.cxx
@@ -1315,7 +1315,10 @@ static unsigned int cmLoadFlagTableSpecial(Json::Value entry,
 
 namespace {
 
-cmIDEFlagTable const* cmLoadFlagTableJson(std::string const& flagJsonPath)
+unsigned long long const vsVer16_10_0 = 4503644629696790;
+
+cmIDEFlagTable const* cmLoadFlagTableJson(
+  std::string const& flagJsonPath, cm::optional<unsigned long long> vsver)
 {
   cmIDEFlagTable* ret = nullptr;
   auto savedFlagIterator = loadedFlagJsonFiles.find(flagJsonPath);
@@ -1337,6 +1340,11 @@ cmIDEFlagTable const* cmLoadFlagTableJson(std::string const& flagJsonPath)
           flagEntry.comment = cmLoadFlagTableString(flag, "comment");
           flagEntry.value = cmLoadFlagTableString(flag, "value");
           flagEntry.special = cmLoadFlagTableSpecial(flag, "flags");
+          // FIXME: Port this version check to a Json field.
+          if (vsver && *vsver < vsVer16_10_0 &&
+              flagEntry.IDEName == "ExternalWarningLevel") {
+            continue;
+          }
           flagTable.push_back(flagEntry);
         }
         cmIDEFlagTable endFlag{ "", "", "", "", 0 };
@@ -1364,17 +1372,19 @@ cmIDEFlagTable const* cmGlobalVisualStudio10Generator::LoadFlagTable(
 {
   cmIDEFlagTable const* ret = nullptr;
 
+  cm::optional<unsigned long long> vsver = this->GetVSInstanceVersion();
+
   std::string filename;
   if (!optionsName.empty()) {
     filename = cmGetFlagTableName(optionsName, table);
-    ret = cmLoadFlagTableJson(filename);
+    ret = cmLoadFlagTableJson(filename, vsver);
   } else {
     filename = cmGetFlagTableName(toolsetName, table);
     if (cmSystemTools::FileExists(filename)) {
-      ret = cmLoadFlagTableJson(filename);
+      ret = cmLoadFlagTableJson(filename, vsver);
     } else {
       filename = cmGetFlagTableName(defaultName, table);
-      ret = cmLoadFlagTableJson(filename);
+      ret = cmLoadFlagTableJson(filename, vsver);
     }
   }
 
-- 
GitLab