<div dir="ltr"><div>Hello Erik,</div><div><br></div><div>This commit broke build step on one of our builders:</div><div><a href="http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/11300">http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/11300</a></div><div><br></div><div>. . .</div><div>FAILED: tools/clang/lib/Sema/CMakeFiles/clangSema.dir/SemaTemplate.cpp.obj </div><div>C:\PROGRA~2\MICROS~1.0\VC\bin\amd64\cl.exe  /nologo /TP -DEXPENSIVE_CHECKS -DGTEST_HAS_RTTI=0 -DUNICODE -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_GLIBCXX_DEBUG -D_GNU_SOURCE -D_HAS_EXCEPTIONS=0 -D_SCL_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS -D_UNICODE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -Itools\clang\lib\Sema -IC:\ps4-buildslave2\llvm-clang-x86_64-expensive-checks-win\llvm\tools\clang\lib\Sema -IC:\ps4-buildslave2\llvm-clang-x86_64-expensive-checks-win\llvm\tools\clang\include -Itools\clang\include -Iinclude -IC:\ps4-buildslave2\llvm-clang-x86_64-expensive-checks-win\llvm\include /DWIN32 /D_WINDOWS   /Zc:inline /Zc:strictStrings /Oi /Zc:rvalueCast /W4 -wd4141 -wd4146 -wd4180 -wd4244 -wd4258 -wd4267 -wd4291 -wd4345 -wd4351 -wd4355 -wd4456 -wd4457 -wd4458 -wd4459 -wd4503 -wd4624 -wd4722 -wd4800 -wd4100 -wd4127 -wd4512 -wd4505 -wd4610 -wd4510 -wd4702 -wd4245 -wd4706 -wd4310 -wd4701 -wd4703 -wd4389 -wd4611 -wd4805 -wd4204 -wd4577 -wd4091 -wd4592 -wd4319 -wd4324 -w14062 -we4238 /MDd /Zi /Ob0 /Od /RTC1    /EHs-c- /GR- /showIncludes /Fotools\clang\lib\Sema\CMakeFiles\clangSema.dir\SemaTemplate.cpp.obj /Fdtools\clang\lib\Sema\CMakeFiles\clangSema.dir\clangSema.pdb /FS -c C:\ps4-buildslave2\llvm-clang-x86_64-expensive-checks-win\llvm\tools\clang\lib\Sema\SemaTemplate.cpp</div><div>C:\ps4-buildslave2\llvm-clang-x86_64-expensive-checks-win\llvm\tools\clang\lib\Sema\SemaTemplate.cpp : fatal error C1128: number of sections exceeded object file format limit: compile with /bigobj</div><div>ninja: build stopped: subcommand failed.</div><div><br></div><div><br></div><div>Please have a look?</div><div>The builder was already red and did not sent notifications.</div><div><br></div><div>Thanks</div><div><br></div><div>Galina</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jul 27, 2018 at 2:23 PM, Erik Pilkington via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: epilk<br>
Date: Fri Jul 27 14:23:48 2018<br>
New Revision: 338165<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=338165&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=338165&view=rev</a><br>
Log:<br>
[Sema] Use a TreeTransform to extract deduction guide parameter types<br>
<br>
Previously, we just canonicalized the type, but this lead to crashes with<br>
parameter types that referred to ParmVarDecls of the constructor. There may be<br>
more cases that this TreeTransform needs to handle though, such as a constructor<br>
parameter type referring to a member in an unevaluated context. Canonicalization<br>
doesn't address these cases either though, so we can address them as-needed in<br>
follow-up commits.<br>
<br>
rdar://41330135<br>
<br>
Differential revision: <a href="https://reviews.llvm.org/D49439" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D49439</a><br>
<br>
Modified:<br>
    cfe/trunk/lib/Sema/<wbr>SemaTemplate.cpp<br>
    cfe/trunk/test/SemaCXX/cxx1z-<wbr>class-template-argument-<wbr>deduction.cpp<br>
<br>
Modified: cfe/trunk/lib/Sema/<wbr>SemaTemplate.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=338165&r1=338164&r2=338165&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Sema/<wbr>SemaTemplate.cpp?rev=338165&<wbr>r1=338164&r2=338165&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Sema/<wbr>SemaTemplate.cpp (original)<br>
+++ cfe/trunk/lib/Sema/<wbr>SemaTemplate.cpp Fri Jul 27 14:23:48 2018<br>
@@ -1659,6 +1659,23 @@ DeclResult Sema::CheckClassTemplate(<br>
 }<br>
<br>
 namespace {<br>
+/// Tree transform to "extract" a transformed type from a class template's<br>
+/// constructor to a deduction guide.<br>
+class ExtractTypeForDeductionGuide<br>
+  : public TreeTransform<<wbr>ExtractTypeForDeductionGuide> {<br>
+public:<br>
+  typedef TreeTransform<<wbr>ExtractTypeForDeductionGuide> Base;<br>
+  ExtractTypeForDeductionGuide(<wbr>Sema &SemaRef) : Base(SemaRef) {}<br>
+<br>
+  TypeSourceInfo *transform(TypeSourceInfo *TSI) { return TransformType(TSI); }<br>
+<br>
+  QualType TransformTypedefType(<wbr>TypeLocBuilder &TLB, TypedefTypeLoc TL) {<br>
+    return TransformType(<br>
+        TLB,<br>
+        TL.getTypedefNameDecl()-><wbr>getTypeSourceInfo()-><wbr>getTypeLoc());<br>
+  }<br>
+};<br>
+<br>
 /// Transform to convert portions of a constructor declaration into the<br>
 /// corresponding deduction guide, per C++1z [over.match.class.deduct]p1.<br>
 struct ConvertConstructorToDeductionG<wbr>uideTransform {<br>
@@ -1880,9 +1897,7 @@ private:<br>
                              MultiLevelTemplateArgumentList &Args) {<br>
     TypeSourceInfo *OldDI = OldParam->getTypeSourceInfo();<br>
     TypeSourceInfo *NewDI;<br>
-    if (!Args.getNumLevels())<br>
-      NewDI = OldDI;<br>
-    else if (auto PackTL = OldDI->getTypeLoc().getAs<<wbr>PackExpansionTypeLoc>()) {<br>
+    if (auto PackTL = OldDI->getTypeLoc().getAs<<wbr>PackExpansionTypeLoc>()) {<br>
       // Expand out the one and only element in each inner pack.<br>
       Sema::<wbr>ArgumentPackSubstitutionIndexR<wbr>AII SubstIndex(SemaRef, 0);<br>
       NewDI =<br>
@@ -1898,23 +1913,17 @@ private:<br>
     if (!NewDI)<br>
       return nullptr;<br>
<br>
-    // Canonicalize the type. This (for instance) replaces references to<br>
-    // typedef members of the current instantiations with the definitions of<br>
-    // those typedefs, avoiding triggering instantiation of the deduced type<br>
-    // during deduction.<br>
-    // FIXME: It would be preferable to retain type sugar and source<br>
-    // information here (and handle this in substitution instead).<br>
-    NewDI = SemaRef.Context.<wbr>getTrivialTypeSourceInfo(<br>
-        SemaRef.Context.<wbr>getCanonicalType(NewDI-><wbr>getType()),<br>
-        OldParam->getLocation());<br>
+    // Extract the type. This (for instance) replaces references to typedef<br>
+    // members of the current instantiations with the definitions of those<br>
+    // typedefs, avoiding triggering instantiation of the deduced type during<br>
+    // deduction.<br>
+    NewDI = ExtractTypeForDeductionGuide(<wbr>SemaRef).transform(NewDI);<br>
<br>
     // Resolving a wording defect, we also inherit default arguments from the<br>
     // constructor.<br>
     ExprResult NewDefArg;<br>
     if (OldParam->hasDefaultArg()) {<br>
-      NewDefArg = Args.getNumLevels()<br>
-                      ? SemaRef.SubstExpr(OldParam-><wbr>getDefaultArg(), Args)<br>
-                      : OldParam->getDefaultArg();<br>
+      NewDefArg = SemaRef.SubstExpr(OldParam-><wbr>getDefaultArg(), Args);<br>
       if (NewDefArg.isInvalid())<br>
         return nullptr;<br>
     }<br>
@@ -1929,6 +1938,7 @@ private:<br>
                                                 NewDefArg.get());<br>
     NewParam->setScopeInfo(<wbr>OldParam-><wbr>getFunctionScopeDepth(),<br>
                            OldParam-><wbr>getFunctionScopeIndex());<br>
+    SemaRef.<wbr>CurrentInstantiationScope-><wbr>InstantiatedLocal(OldParam, NewParam);<br>
     return NewParam;<br>
   }<br>
<br>
<br>
Modified: cfe/trunk/test/SemaCXX/cxx1z-<wbr>class-template-argument-<wbr>deduction.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp?rev=338165&r1=338164&r2=338165&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>SemaCXX/cxx1z-class-template-<wbr>argument-deduction.cpp?rev=<wbr>338165&r1=338164&r2=338165&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/SemaCXX/cxx1z-<wbr>class-template-argument-<wbr>deduction.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/cxx1z-<wbr>class-template-argument-<wbr>deduction.cpp Fri Jul 27 14:23:48 2018<br>
@@ -373,6 +373,35 @@ void bar(D<int>& d) {<br>
 }<br>
 }<br>
<br>
+namespace rdar41330135 {<br>
+template <int> struct A {};<br>
+template <class T><br>
+struct S {<br>
+  template <class U><br>
+  S(T a, U t, A<sizeof(t)>);<br>
+};<br>
+template <class T> struct D {<br>
+  D(T t, A<sizeof(t)>);<br>
+};<br>
+int f() {<br>
+  S s(0, 0, A<sizeof(int)>());<br>
+  D d(0, A<sizeof(int)>());<br>
+}<br>
+<br>
+namespace test_dupls {<br>
+template<unsigned long> struct X {};<br>
+template<typename T> struct A {<br>
+  A(T t, X<sizeof(t)>);<br>
+};<br>
+A a(0, {});<br>
+template<typename U> struct B {<br>
+  B(U u, X<sizeof(u)>);<br>
+};<br>
+B b(0, {});<br>
+}<br>
+<br>
+}<br>
+<br>
 #else<br>
<br>
 // expected-no-diagnostics<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>