diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 5456e73956659..882d54f31280a 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -2107,8 +2107,8 @@ void ASTDeclMerger::MergeDefinitionData( auto *Def = DD.Definition; DD = std::move(MergeDD); DD.Definition = Def; - while ((Def = Def->getPreviousDecl())) - cast(Def)->DefinitionData = ⅅ + for (auto *D : Def->redecls()) + cast(D)->DefinitionData = ⅅ return; } diff --git a/clang/test/Modules/GH170084.cpp b/clang/test/Modules/GH170084.cpp new file mode 100644 index 0000000000000..950499467a6bb --- /dev/null +++ b/clang/test/Modules/GH170084.cpp @@ -0,0 +1,75 @@ +// RUN: rm -rf %t +// RUN: mkdir -p %t +// RUN: split-file %s %t +// RUN: cd %t + +// RUN: %clang_cc1 -fmodule-name=stl -fno-cxx-modules -emit-module -fmodules -xc++ stl.cppmap -o stl.pcm +// RUN: %clang_cc1 -fmodule-name=d -fno-cxx-modules -emit-module -fmodules -fmodule-file=stl.pcm -xc++ d.cppmap -o d.pcm +// RUN: %clang_cc1 -fmodule-name=b -fno-cxx-modules -emit-module -fmodules -fmodule-file=stl.pcm -xc++ b.cppmap -o b.pcm +// RUN: %clang_cc1 -fmodule-name=a -fno-cxx-modules -emit-module -fmodules -fmodule-file=stl.pcm -fmodule-file=d.pcm -fmodule-file=b.pcm -xc++ a.cppmap -o a.pcm +// RUN: %clang_cc1 -fno-cxx-modules -fmodules -fmodule-file=a.pcm -emit-llvm -o /dev/null main.cpp + +//--- a.cppmap +module "a" { +header "a.h" +} + +//--- a.h +#include "b.h" +namespace { +void a(absl::set c) { + absl::set b; + c.end(); + c.contains(); +} +} // namespace + +//--- b.cppmap +module "b" { +header "b.h" +} + +//--- b.h +#include "c.h" +void b() { absl::set x; } + +//--- c.h +#include "stl.h" +namespace absl { +template +class set { + public: + struct iterator { + void u() const; + }; + iterator end() const { return {}; } + void contains() const { end().u(); } + pair e(); +}; +} // namespace absl + +//--- d.cppmap +module "d" { +header "d.h" +} + +//--- d.h +#include "c.h" +void d() { absl::set x; } + +//--- stl.cppmap +module "stl" { +header "stl.h" +} + +//--- stl.h +#ifndef _STL_H_ +#define _STL_H_ +template +struct pair; +#endif + +//--- main.cpp +// expected-no-diagnostics +#include "c.h" +void f(absl::set o) { o.contains(); }