Apply clang fix for assertion failure compiling multimedia/minitube
Merge commit 79f9cfbc21e0 from llvm git (by Yaxun (Sam) Liu): Do not merge LocalInstantiationScope for template specialization A lambda in a function template may be recursively instantiated. The recursive lambda will cause a lambda function instantiated multiple times, one inside another. The inner LocalInstantiationScope should not be marked as MergeWithParentScope since it already has references to locals properly substituted, otherwise it causes assertion due to the check for duplicate locals in merged LocalInstantiationScope. Reviewed by: Richard Smith Differential Revision: https://reviews.llvm.org/D98068 Reported by: yuri PR: 257978 MFC after: 3 days
This commit is contained in:
parent
7b0d05d56d
commit
efa485d5c3
@ -4841,10 +4841,13 @@ void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation,
|
||||
// Introduce a new scope where local variable instantiations will be
|
||||
// recorded, unless we're actually a member function within a local
|
||||
// class, in which case we need to merge our results with the parent
|
||||
// scope (of the enclosing function).
|
||||
// scope (of the enclosing function). The exception is instantiating
|
||||
// a function template specialization, since the template to be
|
||||
// instantiated already has references to locals properly substituted.
|
||||
bool MergeWithParentScope = false;
|
||||
if (CXXRecordDecl *Rec = dyn_cast<CXXRecordDecl>(Function->getDeclContext()))
|
||||
MergeWithParentScope = Rec->isLocalClass();
|
||||
MergeWithParentScope =
|
||||
Rec->isLocalClass() && !Function->isFunctionTemplateSpecialization();
|
||||
|
||||
LocalInstantiationScope Scope(*this, MergeWithParentScope);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user