[PATCH] D88680: Add ability to turn off -fpch-instantiate-templates in clang-cl

Shivanshu Goyal via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Oct 1 10:41:09 PDT 2020


shivanshu3 created this revision.
shivanshu3 added reviewers: llunak, rnk, rsmith, hans, zahen.
shivanshu3 added a project: clang.
Herald added subscribers: cfe-commits, dang.
shivanshu3 requested review of this revision.

A lot of our code building with clang-cl.exe using Clang 11 was failing with the following 2 type of errors:

1. explicit specialization of 'foo' after instantiation
2. no matching function for call to 'bar'

Note that we also use `-fdelayed-template-parsing` in our builds.

I tried pretty hard to get a small repro for these failures, but couldn't. So there is some subtle edge case in the `-fpch-instantiate-templates` feature introduced by this change:
https://reviews.llvm.org/D69585

When I tried turning this off using `-fno-pch-instantiate-templates`, builds would silently fail with the same error without any indication that `-fno-pch-instantiate-templates` was being ignored by the compiler. Then I realized this "no" option wasn't actually working when I ran Clang under a debugger.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D88680

Files:
  clang/include/clang/Driver/Options.td
  clang/lib/Driver/ToolChains/Clang.cpp


Index: clang/lib/Driver/ToolChains/Clang.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Clang.cpp
+++ clang/lib/Driver/ToolChains/Clang.cpp
@@ -1212,7 +1212,10 @@
     if (YcArg && JA.getKind() >= Action::PrecompileJobClass &&
         JA.getKind() <= Action::AssembleJobClass) {
       CmdArgs.push_back(Args.MakeArgString("-building-pch-with-obj"));
-      CmdArgs.push_back(Args.MakeArgString("-fpch-instantiate-templates"));
+      // -fpch-instantiate-templates is the default when creating
+      // precomp using /Yc
+      if (!Args.hasArg(options::OPT_fno_pch_instantiate_templates))
+        CmdArgs.push_back(Args.MakeArgString("-fpch-instantiate-templates"));
     }
     if (YcArg || YuArg) {
       StringRef ThroughHeader = YcArg ? YcArg->getValue() : YuArg->getValue();
Index: clang/include/clang/Driver/Options.td
===================================================================
--- clang/include/clang/Driver/Options.td
+++ clang/include/clang/Driver/Options.td
@@ -1475,11 +1475,11 @@
   Group<f_Group>, Flags<[DriverOption]>;
 def fpch_instantiate_templates:
   Flag <["-"], "fpch-instantiate-templates">,
-  Group<f_Group>, Flags<[CC1Option]>,
+  Group<f_Group>, Flags<[CC1Option, CoreOption]>,
   HelpText<"Instantiate templates already while building a PCH">;
 def fno_pch_instantiate_templates:
   Flag <["-"], "fno-pch-instantiate-templates">,
-  Group<f_Group>, Flags<[CC1Option]>;
+  Group<f_Group>, Flags<[CC1Option, CoreOption]>;
 defm pch_codegen: OptInFFlag<"pch-codegen", "Generate ", "Do not generate ",
   "code for uses of this PCH that assumes an explicit object file will be built for the PCH">;
 defm pch_debuginfo: OptInFFlag<"pch-debuginfo", "Generate ", "Do not generate ",


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D88680.295615.patch
Type: text/x-patch
Size: 1775 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20201001/41061c6b/attachment-0001.bin>


More information about the cfe-commits mailing list