r369402 - win: Enable /Zc:twoPhase by default if targeting MSVC 2017 update 3 or newer

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Thu Aug 22 06:14:53 PDT 2019


Reverted in r369647 due to
https://bugs.chromium.org/p/chromium/issues/detail?id=996675

On Tue, Aug 20, 2019 at 6:26 PM Nico Weber via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
>
> Author: nico
> Date: Tue Aug 20 09:28:11 2019
> New Revision: 369402
>
> URL: http://llvm.org/viewvc/llvm-project?rev=369402&view=rev
> Log:
> win: Enable /Zc:twoPhase by default if targeting MSVC 2017 update 3 or newer
>
> MSVC 2017 update 3 (_MSC_VER 1911) enables /Zc:twoPhase by default, and
> so should clang-cl:
> https://docs.microsoft.com/en-us/cpp/build/reference/zc-twophase
>
> clang-cl takes the MSVC version it emulates from the -fmsc-version flag,
> or if that's not passed it tries to check what the installed version of
> MSVC is and uses that, and failing that it uses a default version that's
> currently 1911. So this changes the default if no -fmsc-version flag is
> passed and no installed MSVC is detected. (It also changes the default
> if -fmsc-version is passed or MSVC is detected, and either indicates
> _MSC_VER >= 1911.)
>
> As mentioned in the MSDN article, the Windows SDK header files in
> version 10.0.15063.0 (Creators Update or Redstone 2) and earlier
> versions do not work correctly with /Zc:twoPhase. If you need to use
> these old SDKs with a new clang-cl, explicitly pass /Zc:twoPhase- to get
> the old behavior.
>
> Fixes PR43032.
>
> Differential Revision: https://reviews.llvm.org/D66394
>
> Modified:
>     cfe/trunk/docs/ReleaseNotes.rst
>     cfe/trunk/include/clang/Driver/CLCompatOptions.td
>     cfe/trunk/lib/Driver/ToolChains/Clang.cpp
>     cfe/trunk/test/Driver/cl-options.c
>
> Modified: cfe/trunk/docs/ReleaseNotes.rst
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/ReleaseNotes.rst?rev=369402&r1=369401&r2=369402&view=diff
> ==============================================================================
> --- cfe/trunk/docs/ReleaseNotes.rst (original)
> +++ cfe/trunk/docs/ReleaseNotes.rst Tue Aug 20 09:28:11 2019
> @@ -90,6 +90,9 @@ Attribute Changes in Clang
>  Windows Support
>  ---------------
>
> +- clang-cl now defaults to ``/Zc:twoPhase`` if targeting MSVC2017 update 3 or
> +  later (``_MSC_VER`` >= 1911). This matches MSVC's behavior. Explicitly pass
> +  ``/Zc:twoPhase-`` to restore the old behavior.
>  - ...
>
>  C Language Changes in Clang
>
> Modified: cfe/trunk/include/clang/Driver/CLCompatOptions.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CLCompatOptions.td?rev=369402&r1=369401&r2=369402&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Driver/CLCompatOptions.td (original)
> +++ cfe/trunk/include/clang/Driver/CLCompatOptions.td Tue Aug 20 09:28:11 2019
> @@ -235,10 +235,10 @@ def _SLASH_Zc_trigraphs : CLFlag<"Zc:tri
>  def _SLASH_Zc_trigraphs_off : CLFlag<"Zc:trigraphs-">,
>    HelpText<"Disable trigraphs (default)">, Alias<fno_trigraphs>;
>  def _SLASH_Zc_twoPhase : CLFlag<"Zc:twoPhase">,
> -  HelpText<"Enable two-phase name lookup in templates">,
> +  HelpText<"Enable two-phase name lookup in templates (default)">,
>    Alias<fno_delayed_template_parsing>;
>  def _SLASH_Zc_twoPhase_ : CLFlag<"Zc:twoPhase-">,
> -  HelpText<"Disable two-phase name lookup in templates (default)">,
> +  HelpText<"Disable two-phase name lookup in templates">,
>    Alias<fdelayed_template_parsing>;
>  def _SLASH_Z7 : CLFlag<"Z7">,
>    HelpText<"Enable CodeView debug information in object files">;
>
> Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Clang.cpp?rev=369402&r1=369401&r2=369402&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original)
> +++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Tue Aug 20 09:28:11 2019
> @@ -4883,12 +4883,14 @@ void Clang::ConstructJob(Compilation &C,
>                      !IsWindowsMSVC || IsMSVC2015Compatible))
>      CmdArgs.push_back("-fno-threadsafe-statics");
>
> -  // -fno-delayed-template-parsing is default, except when targeting MSVC.
> -  // Many old Windows SDK versions require this to parse.
> -  // FIXME: MSVC introduced /Zc:twoPhase- to disable this behavior in their
> -  // compiler. We should be able to disable this by default at some point.
> +  // -fno-delayed-template-parsing is default, except when targeting MSVC
> +  // earlier than MSVC 2017 15.3 (_MSC_VER 1911).  Windows SDK versions
> +  // 10.0.15063.0 (Creators Update or Redstone 2) and earlier require this to
> +  // parse.
> +  bool IsMSVCBefore2017Update3 = !MSVT.empty() && MSVT < VersionTuple(19, 11);
>    if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
> -                   options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
> +                   options::OPT_fno_delayed_template_parsing,
> +                   IsMSVCBefore2017Update3))
>      CmdArgs.push_back("-fdelayed-template-parsing");
>
>    // -fgnu-keywords default varies depending on language; only pass if
>
> Modified: cfe/trunk/test/Driver/cl-options.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/cl-options.c?rev=369402&r1=369401&r2=369402&view=diff
> ==============================================================================
> --- cfe/trunk/test/Driver/cl-options.c (original)
> +++ cfe/trunk/test/Driver/cl-options.c Tue Aug 20 09:28:11 2019
> @@ -316,13 +316,19 @@
>
>  // We recognize -f[no-]delayed-template-parsing.
>  // /Zc:twoPhase[-] has the opposite meaning.
> -// RUN: %clang_cl -c -### -- %s 2>&1 | FileCheck -check-prefix=DELAYEDDEFAULT %s
> -// DELAYEDDEFAULT: "-fdelayed-template-parsing"
> -// RUN: %clang_cl -c -fdelayed-template-parsing -### -- %s 2>&1 | FileCheck -check-prefix=DELAYEDON %s
> -// RUN: %clang_cl -c /Zc:twoPhase- -### -- %s 2>&1 | FileCheck -check-prefix=DELAYEDON %s
> +// RUN: %clang_cl -c -fmsc-version=1910 -### -- %s 2>&1 | FileCheck -check-prefix=OLDDELAYEDDEFAULT %s
> +// OLDDELAYEDDEFAULT: "-fdelayed-template-parsing"
> +// RUN: %clang_cl -fmsc-version=1911 -c -### -- %s 2>&1 | FileCheck -check-prefix=NEWDELAYEDDEFAULT %s
> +// NEWDELAYEDDEFAULT-NOT: "-fdelayed-template-parsing"
> +// RUN: %clang_cl -c -fmsc-version=1910 -fdelayed-template-parsing -### -- %s 2>&1 | FileCheck -check-prefix=DELAYEDON %s
> +// RUN: %clang_cl -c -fmsc-version=1911 -fdelayed-template-parsing -### -- %s 2>&1 | FileCheck -check-prefix=DELAYEDON %s
> +// RUN: %clang_cl -c -fmsc-version=1910 /Zc:twoPhase- -### -- %s 2>&1 | FileCheck -check-prefix=DELAYEDON %s
> +// RUN: %clang_cl -c -fmsc-version=1911 /Zc:twoPhase- -### -- %s 2>&1 | FileCheck -check-prefix=DELAYEDON %s
>  // DELAYEDON: "-fdelayed-template-parsing"
> -// RUN: %clang_cl -c -fno-delayed-template-parsing -### -- %s 2>&1 | FileCheck -check-prefix=DELAYEDOFF %s
> -// RUN: %clang_cl -c /Zc:twoPhase -### -- %s 2>&1 | FileCheck -check-prefix=DELAYEDOFF %s
> +// RUN: %clang_cl -c -fmsc-version=1910 -fno-delayed-template-parsing -### -- %s 2>&1 | FileCheck -check-prefix=DELAYEDOFF %s
> +// RUN: %clang_cl -c -fmsc-version=1911 -fno-delayed-template-parsing -### -- %s 2>&1 | FileCheck -check-prefix=DELAYEDOFF %s
> +// RUN: %clang_cl -c -fmsc-version=1910 /Zc:twoPhase -### -- %s 2>&1 | FileCheck -check-prefix=DELAYEDOFF %s
> +// RUN: %clang_cl -c -fmsc-version=1911 /Zc:twoPhase -### -- %s 2>&1 | FileCheck -check-prefix=DELAYEDOFF %s
>  // DELAYEDOFF-NOT: "-fdelayed-template-parsing"
>
>  // RUN: %clang_cl -c -### /std:c++latest -- %s 2>&1 | FileCheck -check-prefix CHECK-LATEST-CHAR8_T %s
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list