diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/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|? ============================== diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/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>; +def warn_drv_unsupported_ms_compatibility_version : Warning<"unsupported '%0' is ignored. " + "19.0 is the minimum supported version">, + InGroup; def warn_drv_fuse_ld_path : Warning< "'-fuse-ld=' taking a path is deprecated; use '--ld-path=' instead">, diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp --- a/clang/lib/Driver/ToolChain.cpp +++ b/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; } } diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/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. diff --git a/clang/test/Driver/cl-options.c b/clang/test/Driver/cl-options.c --- a/clang/test/Driver/cl-options.c +++ b/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 diff --git a/clang/test/Driver/cl-zc.cpp b/clang/test/Driver/cl-zc.cpp --- a/clang/test/Driver/cl-zc.cpp +++ b/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" diff --git a/clang/test/Driver/msc-version.c b/clang/test/Driver/msc-version.c --- a/clang/test/Driver/msc-version.c +++ b/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 - &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 - &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 - &1 | FileCheck %s -check-prefix CHECK-MSC-17 +// RUN: %clang -### -target i686-windows -fms-compatibility -fmsc-version=19 -E - &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 - &1 | FileCheck %s -check-prefix CHECK-MSC-16 +// RUN: %clang -### -target i686-windows -fms-compatibility -fmsc-version=1900 -E - &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 - &1 | FileCheck %s -check-prefix CHECK-MSC-15 +// RUN: %clang -### -target i686-windows -fms-compatibility -fmsc-version=190020706 -E - &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