HomePhabricator

[Modules] Fix creating fake definition data for lambdas.

Description

[Modules] Fix creating fake definition data for lambdas.

During reading C++ definition data for lambda we can access
CXXRecordDecl representing lambda before we finished reading the
definition data. This can happen by reading a captured variable which is
VarDecl, then reading its decl context which is CXXMethodDecl operator(),
then trying to merge redeclarable methods and accessing
enclosing CXXRecordDecl. The call stack looks roughly like

VisitCXXRecordDecl
  ReadCXXRecordDefinition
    VisitVarDecl
      VisitCXXMethodDecl
        mergeRedeclarable
          getPrimaryContextForMerging

If we add fake definition data at this point, later we'll hit the assertion

Assertion failed: (!DD.IsLambda && !MergeDD.IsLambda && "faked up lambda definition?"), function MergeDefinitionData, file clang/lib/Serialization/ASTReaderDecl.cpp, line 1675.

The fix is to assign definition data before reading it. Fixes PR32556.

rdar://problem/37461072

Reviewers: rsmith, bruno

Reviewed By: rsmith

Subscribers: cfe-commits, jkorous-apple, aprantl

Differential Revision: https://reviews.llvm.org/D43494

Details

Committed
vsapsaiMar 21 2018, 2:28 PM
Reviewer
rsmith
Differential Revision
D43494: [Modules] Fix creating fake definition data for lambdas.
Parents
rL328152: [InstCombine] move/add tests for fmul distribution; NFC
Branches
Unknown
Tags
Unknown