[PATCH] Local classes in templates (PR9685 fix)

Erik Olofsson erik at olofsson.info
Sun Aug 11 05:41:52 PDT 2013

Hi doug.gregor,

This patch is an update to the patch I made last year: http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20120820/063039.html

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.

I have addressed all the minor things in the linked email.

> I don't quite understand this. Local classes cannot have member templates, so what exactly are we adjusting for here?

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. 

I have also included the original tests for PR9685 in c++1y mode which allows this.

> 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?

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?

This is some statistics for a function/template heavy compilation (which does not require this patch). It's generating grammar with boost::spirit:

clang compiled in release without asserts.

Number of saved scopes: 61336
Number of restored scopes: 10323

User time averaged over 5 invocations without patch: 11.381s
User time averaged over 5 invocations with patch: 11.375s

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):

Running Time	Self		Symbol Name
17303.2ms   22.0%	0.0	 	clang-3 (46986)
23.4ms    0.1%	23.4	 	clang::LocalInstantiationScope::Exit()
18.6ms    0.1%	18.6	 	clang::FunctionInInstantiationScope::functionInScope(clang::LocalInstantiationScope*, clang::FunctionDecl*)
2.8ms    0.0%	2.8	 	clang::Sema::setupLocalScope(clang::RestoreLocalInstantiationScope&, clang::Decl*, clang::Decl*)

44.8ms total = 0.25 %


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D1358.1.patch
Type: text/x-patch
Size: 55933 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130811/3dd4ccb3/attachment.bin>

More information about the cfe-commits mailing list