Index: clang/lib/Serialization/ASTReaderDecl.cpp =================================================================== --- clang/lib/Serialization/ASTReaderDecl.cpp +++ clang/lib/Serialization/ASTReaderDecl.cpp @@ -1782,7 +1782,10 @@ else DD = new (C) struct CXXRecordDecl::DefinitionData(D); + assert(!D->IsBeingDefined && "Should not overwrite definition in progress"); + D->IsBeingDefined = true; ReadCXXDefinitionData(*DD, D); + D->IsBeingDefined = false; // 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 @@ -2963,6 +2966,9 @@ if (!DD) DD = RD->getCanonicalDecl()->DefinitionData; + if (!DD && RD->isBeingDefined()) + return nullptr; + // If there's no definition yet, then DC's definition is added by an update // record, but we've not yet loaded that update record. In this case, we // commit to DC being the canonical definition now, and will fix this when 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"