MaskRay updated this revision to Diff 462292.
MaskRay retitled this revision from "[Driver] Drop MSVC<2015 tweaking" to 
"[Driver] Ignore -fmsc-version= -fms-compatibility-version= values smaller than 
19".
MaskRay edited the summary of this revision.
MaskRay added a comment.

.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D134468/new/

https://reviews.llvm.org/D134468

Files:
  clang/docs/ReleaseNotes.rst
  clang/include/clang/Basic/DiagnosticDriverKinds.td
  clang/lib/Driver/ToolChain.cpp
  clang/lib/Driver/ToolChains/Clang.cpp
  clang/test/Driver/cl-options.c
  clang/test/Driver/cl-zc.cpp
  clang/test/Driver/msc-version.c

Index: clang/test/Driver/msc-version.c
===================================================================
--- clang/test/Driver/msc-version.c
+++ clang/test/Driver/msc-version.c
@@ -2,36 +2,36 @@
 // Verify -fms-compatibility-version parsing
 //
 
-// RUN: %clang -target i686-windows -fms-compatibility -fms-compatibility-version=14 -dM -E - </dev/null -o - | FileCheck %s -check-prefix CHECK-MSC-VERSION-MAJOR
+// RUN: %clang -target i686-windows -fms-compatibility -fms-compatibility-version=20 -dM -E - </dev/null -o - | FileCheck %s -check-prefix CHECK-MSC-VERSION-MAJOR
 
 // CHECK-MSC-VERSION-MAJOR: _MSC_BUILD 1
-// CHECK-MSC-VERSION-MAJOR: _MSC_FULL_VER 140000000
-// CHECK-MSC-VERSION-MAJOR: _MSC_VER 1400
+// CHECK-MSC-VERSION-MAJOR: _MSC_FULL_VER 200000000
+// CHECK-MSC-VERSION-MAJOR: _MSC_VER 2000
 
-// RUN: %clang -target i686-windows -fms-compatibility -fms-compatibility-version=15.00 -dM -E - </dev/null -o - | FileCheck %s -check-prefix CHECK-MSC-VERSION-MAJOR-MINOR
+// RUN: %clang -target i686-windows -fms-compatibility -fms-compatibility-version=19.00 -dM -E - </dev/null -o - | FileCheck %s -check-prefix CHECK-MSC-VERSION-MAJOR-MINOR
 
 // CHECK-MSC-VERSION-MAJOR-MINOR: _MSC_BUILD 1
-// CHECK-MSC-VERSION-MAJOR-MINOR: _MSC_FULL_VER 150000000
-// CHECK-MSC-VERSION-MAJOR-MINOR: _MSC_VER 1500
+// CHECK-MSC-VERSION-MAJOR-MINOR: _MSC_FULL_VER 190000000
+// CHECK-MSC-VERSION-MAJOR-MINOR: _MSC_VER 1900
 
-// RUN: %clang -target i686-windows -fms-compatibility -fms-compatibility-version=15.00.20706 -dM -E - </dev/null -o - | FileCheck %s -check-prefix CHECK-MSC-VERSION-MAJOR-MINOR-BUILD
+// RUN: %clang -target i686-windows -fms-compatibility -fms-compatibility-version=19.00.20706 -dM -E - </dev/null -o - | FileCheck %s -check-prefix CHECK-MSC-VERSION-MAJOR-MINOR-BUILD
 
 // CHECK-MSC-VERSION-MAJOR-MINOR-BUILD: _MSC_BUILD 1
-// CHECK-MSC-VERSION-MAJOR-MINOR-BUILD: _MSC_FULL_VER 150020706
-// CHECK-MSC-VERSION-MAJOR-MINOR-BUILD: _MSC_VER 1500
+// CHECK-MSC-VERSION-MAJOR-MINOR-BUILD: _MSC_FULL_VER 190020706
+// CHECK-MSC-VERSION-MAJOR-MINOR-BUILD: _MSC_VER 1900
 
-// RUN: %clang -target i686-windows -fms-compatibility -fms-compatibility-version=15.00.20706.01 -dM -E - </dev/null -o - | FileCheck %s -check-prefix CHECK-MSC-VERSION-MAJOR-MINOR-BUILD-PATCH
+// RUN: %clang -target i686-windows -fms-compatibility -fms-compatibility-version=19.00.20706.01 -dM -E - </dev/null -o - | FileCheck %s -check-prefix CHECK-MSC-VERSION-MAJOR-MINOR-BUILD-PATCH
 
 // CHECK-MSC-VERSION-MAJOR-MINOR-BUILD-PATCH: _MSC_BUILD 1
-// CHECK-MSC-VERSION-MAJOR-MINOR-BUILD-PATCH: _MSC_FULL_VER 150020706
-// CHECK-MSC-VERSION-MAJOR-MINOR-BUILD-PATCH: _MSC_VER 1500
+// CHECK-MSC-VERSION-MAJOR-MINOR-BUILD-PATCH: _MSC_FULL_VER 190020706
+// CHECK-MSC-VERSION-MAJOR-MINOR-BUILD-PATCH: _MSC_VER 1900
 
 
 //
 // Verify -fmsc-version and -fms-compatibility-version diagnostic
 //
 
-// RUN: not %clang -target i686-windows -fms-compatibility -fmsc-version=1700 -fms-compatibility-version=17.00.50727.1 -E - </dev/null 2>&1 | FileCheck %s -check-prefix CHECK-BASIC-EXTENDED-DIAGNOSTIC
+// RUN: not %clang -target i686-windows -fms-compatibility -fmsc-version=1900 -fms-compatibility-version=19.00.50727.1 -E - </dev/null 2>&1 | FileCheck %s -check-prefix CHECK-BASIC-EXTENDED-DIAGNOSTIC
 
 // CHECK-BASIC-EXTENDED-DIAGNOSTIC: invalid argument '-fmsc-version={{.*}}' not allowed with '-fms-compatibility-version={{.*}}'
 
@@ -40,20 +40,20 @@
 // Verify -fmsc-version to -fms-compatibility-version conversion
 //
 
-// RUN: %clang -### -target i686-windows -fms-compatibility -fmsc-version=17 -E - </dev/null -o /dev/null 2>&1 | FileCheck %s -check-prefix CHECK-MSC-17
+// RUN: %clang -### -target i686-windows -fms-compatibility -fmsc-version=19 -E - </dev/null -o /dev/null 2>&1 | FileCheck %s -check-prefix CHECK-MSC-17
 
-// CHECK-MSC-17-NOT: "-fmsc-version=1700"
-// CHECK-MSC-17: "-fms-compatibility-version=17"
+// CHECK-MSC-17-NOT: "-fmsc-version=1900"
+// CHECK-MSC-17: "-fms-compatibility-version=19"
 
-// RUN: %clang -### -target i686-windows -fms-compatibility -fmsc-version=1600 -E - </dev/null -o /dev/null 2>&1 | FileCheck %s -check-prefix CHECK-MSC-16
+// RUN: %clang -### -target i686-windows -fms-compatibility -fmsc-version=1900 -E - </dev/null -o /dev/null 2>&1 | FileCheck %s -check-prefix CHECK-MSC-16
 
-// CHECK-MSC-16-NOT: "-fmsc-version=1600"
-// CHECK-MSC-16: "-fms-compatibility-version=16.0"
+// CHECK-MSC-16-NOT: "-fmsc-version=1900"
+// CHECK-MSC-16: "-fms-compatibility-version=19.0"
 
-// RUN: %clang -### -target i686-windows -fms-compatibility -fmsc-version=150020706 -E - </dev/null -o /dev/null 2>&1 | FileCheck %s -check-prefix CHECK-MSC-15
+// RUN: %clang -### -target i686-windows -fms-compatibility -fmsc-version=190020706 -E - </dev/null -o /dev/null 2>&1 | FileCheck %s -check-prefix CHECK-MSC-15
 
-// CHECK-MSC-15-NOT: "-fmsc-version=150020706"
-// CHECK-MSC-15: "-fms-compatibility-version=15.0.20706"
+// CHECK-MSC-15-NOT: "-fmsc-version=190020706"
+// CHECK-MSC-15: "-fms-compatibility-version=19.0.20706"
 
 //
 // Verify default version with -fms-extensions
@@ -64,3 +64,13 @@
 // CHECK-MS-EXTENSIONS: _MSC_BUILD 1
 // CHECK-MS-EXTENSIONS: _MSC_FULL_VER {{.+}}
 // CHECK-MS-EXTENSIONS: _MSC_VER {{....}}
+
+/// Versions before 19 are ignored.
+// RUN: %clang --target=i686-windows -fms-compatibility -fmsc-version=18 -dM -E %s -o - 2>&1 | FileCheck %s --check-prefixes=IGNORED-MSC,MSC-18
+// RUN: %clang --target=i686-windows -fms-compatibility -fms-compatibility-version=18 -dM -E %s -o - 2>&1 | FileCheck %s --check-prefixes=IGNORED-MS-COMPATIBILITY,MSC-18
+
+// IGNORED-MSC: warning: unsupported '-fmsc-version=18' is ignored. 19.0 is the minimum supported version [-Woption-ignored]
+// IGNORED-MS-COMPATIBILITY: warning: unsupported '-fms-compatibility-version=18' is ignored. 19.0 is the minimum supported version [-Woption-ignored]
+
+// MSC-18-NOT: _MSC_FULL_VER 180000000
+// MSC-18-NOT: _MSC_VER 1800
Index: clang/test/Driver/cl-zc.cpp
===================================================================
--- clang/test/Driver/cl-zc.cpp
+++ clang/test/Driver/cl-zc.cpp
@@ -91,11 +91,6 @@
 // RUN: %clang_cl /c -### /Zc:ternary- -- %s 2>&1 | FileCheck -check-prefix=TERNARY-OFF %s
 // TERNARY-OFF: argument unused during compilation
 
-// thread safe statics are off for versions < 19.
-// RUN: %clang_cl /c -### -fms-compatibility-version=18 -- %s 2>&1 | FileCheck -check-prefix=NoThreadSafeStatics %s
-// RUN: %clang_cl /Zc:threadSafeInit /Zc:threadSafeInit- /c -### -- %s 2>&1 | FileCheck -check-prefix=NoThreadSafeStatics %s
-// NoThreadSafeStatics: "-fno-threadsafe-statics"
-
 // RUN: %clang_cl /Zc:threadSafeInit /c -### -- %s 2>&1 | FileCheck -check-prefix=ThreadSafeStatics %s
 // ThreadSafeStatics-NOT: "-fno-threadsafe-statics"
 
Index: clang/test/Driver/cl-options.c
===================================================================
--- clang/test/Driver/cl-options.c
+++ clang/test/Driver/cl-options.c
@@ -578,8 +578,7 @@
 // Z7_gdwarf: "-debug-info-kind=constructor"
 // Z7_gdwarf: "-dwarf-version=
 
-// RUN: %clang_cl -fmsc-version=1800 -TP -### -- %s 2>&1 | FileCheck -check-prefix=CXX11 %s
-// CXX11: -std=c++11
+// RUN: %clang_cl -fmsc-version=1800 -TP -### -- %s 2>&1 | FileCheck -check-prefix=CXX14 %s
 
 // RUN: %clang_cl -fmsc-version=1900 -TP -### -- %s 2>&1 | FileCheck -check-prefix=CXX14 %s
 // CXX14: -std=c++14
Index: clang/lib/Driver/ToolChains/Clang.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Clang.cpp
+++ clang/lib/Driver/ToolChains/Clang.cpp
@@ -6598,7 +6598,6 @@
     CmdArgs.push_back(
         Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
 
-  bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
   if (ImplyVCPPCVer) {
     StringRef LanguageStandard;
     if (const Arg *StdArg = Args.getLastArg(options::OPT__SLASH_std)) {
@@ -6628,12 +6627,8 @@
             << StdArg->getAsString(Args);
     }
 
-    if (LanguageStandard.empty()) {
-      if (IsMSVC2015Compatible)
-        LanguageStandard = "-std=c++14";
-      else
-        LanguageStandard = "-std=c++11";
-    }
+    if (LanguageStandard.empty())
+      LanguageStandard = "-std=c++14";
 
     CmdArgs.push_back(LanguageStandard.data());
   }
@@ -6648,12 +6643,10 @@
   else if (Args.hasArg(options::OPT_fno_declspec))
     CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
 
-  // -fthreadsafe-static is default, except for MSVC compatibility versions less
-  // than 19.
+  // -fthreadsafe-static is default, except for OpenCL.
   if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
                     options::OPT_fno_threadsafe_statics,
-                    !types::isOpenCL(InputType) &&
-                        (!IsWindowsMSVC || IsMSVC2015Compatible)))
+                    !types::isOpenCL(InputType)))
     CmdArgs.push_back("-fno-threadsafe-statics");
 
   // -fno-delayed-template-parsing is default, except when targeting MSVC.
Index: clang/lib/Driver/ToolChain.cpp
===================================================================
--- clang/lib/Driver/ToolChain.cpp
+++ clang/lib/Driver/ToolChain.cpp
@@ -1143,6 +1143,12 @@
             << MSCompatibilityVersion->getAsString(Args)
             << MSCompatibilityVersion->getValue();
     } else {
+      if (MSVT.getMajor() < 19) {
+        if (D)
+          D->Diag(diag::warn_drv_unsupported_ms_compatibility_version)
+              << MSCompatibilityVersion->getAsString(Args);
+        MSVT = VersionTuple();
+      }
       return MSVT;
     }
   }
@@ -1154,7 +1160,14 @@
         D->Diag(diag::err_drv_invalid_value)
             << MSCVersion->getAsString(Args) << MSCVersion->getValue();
     } else {
-      return separateMSVCFullVersion(Version);
+      VersionTuple MSVT = separateMSVCFullVersion(Version);
+      if (MSVT.getMajor() < 19) {
+        if (D)
+          D->Diag(diag::warn_drv_unsupported_ms_compatibility_version)
+              << MSCVersion->getAsString(Args);
+        MSVT = VersionTuple();
+      }
+      return MSVT;
     }
   }
 
Index: clang/include/clang/Basic/DiagnosticDriverKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -555,6 +555,9 @@
   "unable to find a Visual Studio installation; "
   "try running Clang from a developer command prompt">,
   InGroup<DiagGroup<"msvc-not-found">>;
+def warn_drv_unsupported_ms_compatibility_version : Warning<"unsupported '%0' is ignored. "
+  "19.0 is the minimum supported version">,
+  InGroup<OptionIgnored>;
 
 def warn_drv_fuse_ld_path : Warning<
   "'-fuse-ld=' taking a path is deprecated; use '--ld-path=' instead">,
Index: clang/docs/ReleaseNotes.rst
===================================================================
--- clang/docs/ReleaseNotes.rst
+++ clang/docs/ReleaseNotes.rst
@@ -80,6 +80,9 @@
       void (*fp)(int *) = func; // Previously a warning, now a downgradable error.
     }
 
+- When ``-fmsc-version=`` or ``-fms-compatibility-version=`` is specified,
+  a version smaller than ``19.0`` is now unsupported.
+
 
 What's New in Clang |release|?
 ==============================
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to