<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Apr 26, 2016 at 1:55 PM, Akira Hatanaka 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">ahatanak added a comment.<br>
<br>
I'm looking for a way to avoid the assert in Sema::PerformDependentDiagnostics that is fired when a template parameter doesn't have a name.<br>
<br>
In order to avoid the assert, CXXRecordDecl::isDependentLambda() should return true for the old lambda class, and in order to do that, somehow I have to set KnownDependent to true in Sema::ActOnStartOfLambdaDefinition when the lambda is used to initialize a variable template.<br>
<br>
I can think of two ways to fix this:<br>
<br>
1. Make changes in Sema::ActOnTypeParameter to call S->AddDecl(Param) regardless of whether Param has a name. This looks harmless to me because the list of Scope's decls is used just to see if a declaration belongs to a certain scope.<br>
<br>
2. Add a field to Scope that indicates whether a variable template is being parsed.<br></blockquote><div><br></div><div>I would expect this to go wrong in other contexts too. For instance: "template<typename> void f(int a = []{ return 0; }()) {}"</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Does this sound like a good idea or are there other ways to do what I'm trying to do?</blockquote><div><br></div><div>This is going wrong in SemaLambda.cpp:818 -- it's trying to figure out whether the lambda appears within a template, but gets the computation wrong if no template parameters are in scope. (The decls_empty() check is trying to distinguish between an explicit specialization scope and a "real" template parameter scope.)</div><div><br></div><div>Ultimately, I think this is a bug in the parser -- it's using a single template parameter scope for a multi-level template parameter list, and also for the case of an explicit specialization. In the former case, there should be multiple template parameter scopes, and in the latter case there should be no scope. I don't think the reuse of the template parameter scope for a multi-level list matters, but we shouldn't have a template parameter scope at all if the only template headers are explicit specialization headers.</div><div><br></div><div>You could change Parser::ParseTemplateDeclarationOrSpecialization to track whether it's only seen explicit specialization 'template<>' headers, and call 'TemplateParmScope.setFlags(0)' if so. Then remove the decls_empty() check from SemaLambda.</div></div></div></div>