Index: clang/lib/Serialization/ASTReaderDecl.cpp =================================================================== --- clang/lib/Serialization/ASTReaderDecl.cpp +++ clang/lib/Serialization/ASTReaderDecl.cpp @@ -1782,13 +1782,17 @@ else DD = new (C) struct CXXRecordDecl::DefinitionData(D); + // Set definition data before reading it, so that during deserialization when + // we read CXXRecordDecl, it already has definition data and we don't set fake + // one. + D->DefinitionData = DD; ReadCXXDefinitionData(*DD, D); // We might already have a definition for this record. This can happen either // because we're reading an update record, or because we've already done some // merging. Either way, just merge into it. CXXRecordDecl *Canon = D->getCanonicalDecl(); - if (Canon->DefinitionData) { + if (Canon->DefinitionData && Canon->DefinitionData != DD) { MergeDefinitionData(Canon, std::move(*DD)); D->DefinitionData = Canon->DefinitionData; return; @@ -1796,7 +1800,6 @@ // Mark this declaration as being a definition. D->IsCompleteDefinition = true; - D->DefinitionData = DD; // If this is not the first declaration or is an update record, we can have // other redeclarations already. Make a note that we need to propagate the Index: clang/test/Modules/Inputs/self-referencing-lambda/a.h =================================================================== --- /dev/null +++ clang/test/Modules/Inputs/self-referencing-lambda/a.h @@ -0,0 +1,4 @@ +void f() { + int x = 0; + auto q = [xm = x]{}; +} Index: clang/test/Modules/Inputs/self-referencing-lambda/module.modulemap =================================================================== --- /dev/null +++ clang/test/Modules/Inputs/self-referencing-lambda/module.modulemap @@ -0,0 +1,4 @@ +module "a.h" { + header "a.h" + export * +} Index: clang/test/Modules/self-referencing-lambda.cpp =================================================================== --- /dev/null +++ clang/test/Modules/self-referencing-lambda.cpp @@ -0,0 +1,5 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -I %S/Inputs/self-referencing-lambda %s -verify -emit-obj -o %t2.o +// expected-no-diagnostics + +#include "a.h"