Hi,<div><br></div><div>DR1484 seeks to clarify that local classes of function templates are *not* separately instantiated, and are instead instantiated as part of instantiating the surrounding function template. Once we implement that, the changes in this patch should become redundant.</div>
<div><div><br></div><div>(Generic lambdas add a complication here, but even then, it seems that we must instantiate the body of the lambda eagerly in order to determine their set of captures.)</div><div><br><div class="gmail_quote">
On Sun, Aug 11, 2013 at 5:41 AM, Erik Olofsson <span dir="ltr"><<a href="mailto:erik@olofsson.info" target="_blank">erik@olofsson.info</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi doug.gregor,<br>
<br>
This patch is an update to the patch I made last year: <a href="http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20120820/063039.html" target="_blank">http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20120820/063039.html</a><br>

<br>
Sorry for not getting to this earlier. I now have proper system setup for handling changes to the multiple patches we have against llvm, so I will be able to address review comments in a timely manner.<br>
<br>
I have addressed all the minor things in the linked email.<br>
<br>
> I don't quite understand this. Local classes cannot have member templates, so what exactly are we adjusting for here?<br>
<br>
Clang was missing an error message when you have a template function inside a local class. I incorrectly thought this was allowed by the standard. I have now fixed clang to emit an error for this case. I also had to fix several tests that assume the same thing.<br>

<br>
I have also included the original tests for PR9685 in c++1y mode which allows this.<br>
<br>
> My only other general comment is that this is a lot of information to save for template instantiations, but it's only used in the (relatively uncommon) case where there is a local class within a function template. Can we only save this information when the pattern from which the function is instantiated actually has a local class somewhere in it?<br>

<br>
I don’t have time to do this optimization right now. I tried to optimize this last year when I first implemented this, but removed it because this was hard enough to get right without it. Could this be committed without it and be revisited?<br>

<br>
This is some statistics for a function/template heavy compilation (which does not require this patch). It's generating grammar with boost::spirit:<br>
<br>
clang compiled in release without asserts.<br>
<br>
Number of saved scopes: 61336<br>
Number of restored scopes: 10323<br>
<br>
User time averaged over 5 invocations without patch: 11.381s<br>
User time averaged over 5 invocations with patch: 11.375s<br>
<br>
I could not find any significant difference in time, as the fluctuations were bigger that the changes, so I used Instruments to profile the compilation (had to sample at 40 µs to see the functions):<br>
<br>
Running Time    Self            Symbol Name<br>
17303.2ms   22.0%       0.0             clang-3 (46986)<br>
23.4ms    0.1%  23.4            clang::LocalInstantiationScope::Exit()<br>
18.6ms    0.1%  18.6            clang::FunctionInInstantiationScope::functionInScope(clang::LocalInstantiationScope*, clang::FunctionDecl*)<br>
2.8ms    0.0%   2.8             clang::Sema::setupLocalScope(clang::RestoreLocalInstantiationScope&, clang::Decl*, clang::Decl*)<br>
<br>
44.8ms total = 0.25 %<br>
<br>
<a href="http://llvm-reviews.chandlerc.com/D1358" target="_blank">http://llvm-reviews.chandlerc.com/D1358</a><br>
<br>
Files:<br>
  include/clang/Basic/DiagnosticSemaKinds.td<br>
  include/clang/Sema/Sema.h<br>
  include/clang/Sema/Template.h<br>
  lib/AST/ItaniumMangle.cpp<br>
  lib/Parse/ParseStmt.cpp<br>
  lib/Sema/SemaTemplate.cpp<br>
  lib/Sema/SemaTemplateInstantiate.cpp<br>
  lib/Sema/SemaTemplateInstantiateDecl.cpp<br>
  lib/Sema/TreeTransform.h<br>
  test/CodeGenCXX/mangle-local-class-names.cpp<br>
  test/PCH/cxx-local-templates.cpp<br>
  test/SemaTemplate/class-template-decl.cpp<br>
  test/SemaTemplate/instantiate-exception-spec-cxx11.cpp<br>
  test/SemaCXX/PR9685-cxx1y.cpp<br>
  test/SemaCXX/PR9685.cpp<br>
<br>_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
<br></blockquote></div><br></div></div>