[Modules] Fix creating fake definition data for lambdas.
authorVolodymyr Sapsai <vsapsai@apple.com>
Wed, 21 Mar 2018 21:28:54 +0000 (21:28 +0000)
committerVolodymyr Sapsai <vsapsai@apple.com>
Wed, 21 Mar 2018 21:28:54 +0000 (21:28 +0000)
commit8a5943f5691920cd1c2dfde975dc1951f7d8e5b4
treec4f0f43bc3e06b9c29b3b4b6a677a42a4ae6676a
parent1d0832d9a3ee4f7e19c000bd9adc11991d9dfe23
[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

llvm-svn: 328153
clang/lib/Serialization/ASTReaderDecl.cpp
clang/test/Modules/Inputs/self-referencing-lambda/a.h [new file with mode: 0644]
clang/test/Modules/Inputs/self-referencing-lambda/module.modulemap [new file with mode: 0644]
clang/test/Modules/self-referencing-lambda.cpp [new file with mode: 0644]