<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/134739>134739</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [Clang][Modules] FE crashes when constructor using-decl are build in header units
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            c++20,
            clang:modules
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          yuxuanchen1997
      </td>
    </tr>
</table>

<pre>
    When upstream clang has assertion turned on, we crash on the following input:

File: `RelaxedAtomic.h`
```cpp
struct relaxed_atomic_base {
 relaxed_atomic_base(int) {}
};

struct relaxed_atomic : relaxed_atomic_base {
  using relaxed_atomic_base::relaxed_atomic_base; // constructor
};
```

File: `SharedMutex.h`
```cpp
import "RelaxedAtomic.h";

inline void getMaxDeferredReaders() {
  static relaxed_atomic cache{0};
}
```

File: `ThreadLocalDetail.h`
```cpp
import "RelaxedAtomic.h";

struct noncopyable {
  noncopyable(const noncopyable&) = delete;
};

struct StaticMetaBase {
  relaxed_atomic nextId_{0};
  noncopyable ncp;
};
```

Repro commands:
```
CXXFLAGS="-std=c++20 -Wno-experimental-header-units"

clang++ $(CXXFLAGS) -fmodule-header RelaxedAtomic.h -o RelaxedAtomic.pcm
clang++ $(CXXFLAGS) -fmodule-header -fmodule-file=RelaxedAtomic.pcm SharedMutex.h -o SharedMutex.pcm
clang++ $(CXXFLAGS) -fmodule-header -fmodule-file=SharedMutex.pcm -fmodule-file=RelaxedAtomic.pcm ThreadLocalDetail.h -o ThreadLocalDetail.pcm
```
On the third invocation of clang, we crash with the following back trace:

```
clang-21: /home/ych/llvm-project/clang/lib/Serialization/ASTWriter.cpp:4662: void clang::ASTWriter::GenerateNameLookupTable(ASTContext &, const DeclContext *, llvm::SmallVectorImpl<char> &, llvm::SmallVectorImpl<char> &, llvm::SmallVectorImpl<char> &): Assertion `ConstructorNameSet.empty() && "Failed to find all of the visible " "constructors by walking all the " "lexical members of the context."' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.      Program arguments: /data/users/ych/server-llvm/llvm-project/build/bin/clang-21 -std=c++20 -Wno-experimental-header-units -fmodule-header -fmodule-file=SharedMutex.pcm -fmodule-file=RelaxedAtomic.pcm ThreadLocalDetail.h -o ThreadLocalDetail.pcm
1.      <eof> parser at end of file
 #0 0x000000000723967d llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/ych/llvm-project/llvm/lib/Support/Unix/Signals.inc:804:11
 #1 0x0000000007239b3b PrintStackTraceSignalHandler(void*) /home/ych/llvm-project/llvm/lib/Support/Unix/Signals.inc:880:1
 #2 0x0000000007237cdf llvm::sys::RunSignalHandlers() /home/ych/llvm-project/llvm/lib/Support/Signals.cpp:105:5
 #3 0x0000000007238f89 llvm::sys::CleanupOnSignal(unsigned long) /home/ych/llvm-project/llvm/lib/Support/Unix/Signals.inc:370:1
 #4 0x0000000007164cb2 (anonymous namespace)::CrashRecoveryContextImpl::HandleCrash(int, unsigned long) CrashRecoveryContext.cpp:0:0
 #5 0x0000000007165016 CrashRecoverySignalHandler(int) /home/ych/llvm-project/llvm/lib/Support/CrashRecoveryContext.cpp:391:1
 #6 0x00007f5b30a3ebf0 __restore_rt (/lib64/libc.so.6+0x3ebf0)
 #7 0x00007f5b30a8be0c __pthread_kill_implementation (/lib64/libc.so.6+0x8be0c)
 #8 0x00007f5b30a3eb46 gsignal (/lib64/libc.so.6+0x3eb46)
 #9 0x00007f5b30a28833 abort (/lib64/libc.so.6+0x28833)
#10 0x00007f5b30a2875b _nl_load_domain.cold (/lib64/libc.so.6+0x2875b)
#11 0x00007f5b30a37886 (/lib64/libc.so.6+0x37886)
#12 0x0000000008cd3f0f clang::ASTWriter::GenerateNameLookupTable(clang::ASTContext&, clang::DeclContext const*, llvm::SmallVectorImpl<char>&, llvm::SmallVectorImpl<char>&, llvm::SmallVectorImpl<char>&) /home/ych/llvm-project/clang/lib/Serialization/ASTWriter.cpp:4663:5
#13 0x0000000008cd6687 clang::ASTWriter::WriteDeclContextVisibleUpdate(clang::ASTContext&, clang::DeclContext const*) /home/ych/llvm-project/clang/lib/Serialization/ASTWriter.cpp:4912:7
#14 0x0000000008cf0c71 clang::ASTWriter::WriteDeclAndTypes(clang::ASTContext&) /home/ych/llvm-project/clang/lib/Serialization/ASTWriter.cpp:6321:17
#15 0x0000000008cec5c0 clang::ASTWriter::WriteASTCore(clang::Sema*, llvm::StringRef, clang::Module*) (/data/users/ych/server-llvm/llvm-project/build/bin/clang-21+0x8cec5c0)
#16 0x0000000008ceb87c clang::ASTWriter::WriteAST(llvm::PointerUnion<clang::Sema*, clang::Preprocessor*>, llvm::StringRef, clang::Module*, llvm::StringRef, bool) /home/ych/llvm-project/clang/lib/Serialization/ASTWriter.cpp:5377:32
#17 0x0000000008db6617 clang::PCHGenerator::HandleTranslationUnit(clang::ASTContext&) /home/ych/llvm-project/clang/lib/Serialization/GeneratePCH.cpp:86:30
#18 0x0000000008a2c3fc clang::MultiplexConsumer::HandleTranslationUnit(clang::ASTContext&) /home/ych/llvm-project/clang/lib/Frontend/MultiplexConsumer.cpp:338:23
#19 0x000000000a9c29ab clang::ParseAST(clang::Sema&, bool, bool) /home/ych/llvm-project/clang/lib/Parse/ParseAST.cpp:191:12
#20 0x00000000088c0777 clang::ASTFrontendAction::ExecuteAction() /home/ych/llvm-project/clang/lib/Frontend/FrontendAction.cpp:1188:1
#21 0x00000000088c01d6 clang::FrontendAction::Execute() /home/ych/llvm-project/clang/lib/Frontend/FrontendAction.cpp:1076:7
#22 0x00000000087e3211 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /home/ych/llvm-project/clang/lib/Frontend/CompilerInstance.cpp:1056:23
#23 0x0000000008a842aa clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /home/ych/llvm-project/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:280:8
#24 0x000000000539731e cc1_main(llvm::ArrayRef<char const*>, char const*, void*) /home/ych/llvm-project/clang/tools/driver/cc1_main.cpp:290:13
#25 0x000000000538a3ae ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) /home/ych/llvm-project/clang/tools/driver/driver.cpp:218:5
#26 0x000000000538ae20 clang_main(int, char**, llvm::ToolContext const&)::$_0::operator()(llvm::SmallVectorImpl<char const*>&) const /home/ych/llvm-project/clang/tools/driver/driver.cpp:364:9
#27 0x000000000538aded int llvm::function_ref<int (llvm::SmallVectorImpl<char const*>&)>::callback_fn<clang_main(int, char**, llvm::ToolContext const&)::$_0>(long, llvm::SmallVectorImpl<char const*>&) /home/ych/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:5
#28 0x0000000008657b61 llvm::function_ref<int (llvm::SmallVectorImpl<char const*>&)>::operator()(llvm::SmallVectorImpl<char const*>&) const /home/ych/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:5
#29 0x00000000086546d8 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::$_0::operator()() const /home/ych/llvm-project/clang/lib/Driver/Job.cpp:437:34
#30 0x00000000086546a5 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::$_0>(long) /home/ych/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:5
#31 0x0000000005e95649 llvm::function_ref<void ()>::operator()() const /home/ych/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:69:5
#32 0x0000000007164acf llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) /home/ych/llvm-project/llvm/lib/Support/CrashRecoveryContext.cpp:427:3
#33 0x0000000008654093 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const /home/ych/llvm-project/clang/lib/Driver/Job.cpp:437:7
#34 0x00000000085ee322 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const /home/ych/llvm-project/clang/lib/Driver/Compilation.cpp:196:15
#35 0x00000000085ee4fc clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const /home/ych/llvm-project/clang/lib/Driver/Compilation.cpp:251:13
#36 0x0000000008609c91 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) /home/ych/llvm-project/clang/lib/Driver/Driver.cpp:2166:7
#37 0x0000000005389ec7 clang_main(int, char**, llvm::ToolContext const&) /home/ych/llvm-project/clang/tools/driver/driver.cpp:402:9
#38 0x00000000053bbfb5 main /home/ych/llvm-project/build/tools/clang/tools/driver/clang-driver.cpp:17:3
#39 0x00007f5b30a295d0 __libc_start_call_main (/lib64/libc.so.6+0x295d0)
#40 0x00007f5b30a29680 __libc_start_main@GLIBC_2.2.5 (/lib64/libc.so.6+0x29680)
#41 0x0000000005388c25 _start (/data/users/ych/server-llvm/llvm-project/build/bin/clang-21+0x5388c25)
```
Note that `ThreadLocalDetail.h` doesn't actually import "SharedMutex.h". If you remove `-fmodule-file=SharedMutex.pcm` part this compilation succeeds. I also can't get it to repro when the `using` decl in `relaxed_atomic` is replaced with its own constructor. 
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsWl9z26jX_jTKDROPBPp7kQvFrne70-52mnR37zwI4Zi3CDSAUuf99O8Aki0pzt8mfS9-v04zcSQ4POfh8HAOBmvNbgSlF0FyGSSrM9yZnVQXd92-w4LsqIiKIjurZH138c-OCtC12iiKG0A4FjdghzXAWlNlmBTAdErQGkgRwCX4QQFRWO-AfbGjYCs5lz-YuAFMtJ0JUBmE9v-acRqgEgRp-JVyvKd1aWTDyGIXpKFtkob-P2nbICy1UR0xQPmmG-zabiqsKQiyyyAsT70KYM6ECWDh2mQrazZbBejSQzhpE1hQjwwDOm2dOTUaKgNUnnxxCQK4DuAaECn8qFJNwAzO3uPmaocVrT93hu4fYIY1rVQGBBDOeYTw4CoTnAkKbiWrwQ01n_F-RbdUKVp_pbimSgcwH3iyTmqDDSNzaggmOxpkl-ERuCf1QfjXO0Vx_UkSzFfUYMZ_xol-voQURLZ3uOLHSRk9C2DuWJ4-S513aAVqyqmhR_Qz41fO8c_U4MvxpM-IEHRvPtabCRUTEECQdj7GlKSvtFUSENk0WNS6XxajJst__11_Kn-7CtAqgPBcmzpAKxLAywBewhCc_yPkOd23VLGGCoP5-c5N5HknmNGWNTeKW66-EwhgHMD8YBcW4HzbyLrjtO8LZtyDczl71JLmxUYPf29dWKzuWQSTGLeDjh-8xZAze8-AdCJuLbD7jz288cT95XXP7JiqARO3kmCnknILei9GIvmDmd1MJitMvgOjMKEHrRybdzbOYeQWGFzvZEMDuL4juwCuOb9tzlsl_4cSE8B1P9yasyqA6yuqGObsfx2aAK7Lq-t_FDNULewSRGWcptAadRrhuzpBO7Tzf_5GBVXY0D9xQz9J-b1rr_tVV15dL6UwdG_XcWrd9OtwRQk_vijtCwvUm7tqMOd_UyuIH5uWB2hJdlgF6MNg4z2aFtbP8rB_BWm4POqydeyKmgVtWnM3yKLtlVp5WmPGaQ2MBFsmaoA5txNrZ_CWaeYkCUL7M1J6Dao78APz73Z6bQ_bvG_G6Z4RzEFDm4oqPRgjnq-FXcgwA1s36iIIyy-fPpRXH4DuqoYZgEHV2b3IiaeRYGdM67TE7TY3zOy6akFk08fG_RBhWndU250JCxuthHc19QhcfNpg9LEIl6BVVrMI1ZrWQMtO-ce2J9ZaEoYNrYHqBNBEsdZYvFfGhnPdNa2P5nAB3L8vSt4o3ACsbjorYLqP5xobHMB1p92e1Me1puqWqvPTLlQd47X9zcQQ8-cwAi9UzP9_DYl6ZgK0pHJrY7XFSlMFsAFU1DYy3FCh5QmFINyHw78MoiLN6tEC0Hfaf_iimDBuEq79NObHRgr_2Eif1_UraMiWHteVYR68rHStjb4Arr8JtrcP2I3AXC-YIAEq8zAOUBlFPexoDrtCFZhh9AZ-x6LmVAUwt4LkdONtgeWhBdbjgjNcGam3p-j82okJvEPe9CpgAyIvwFGYBKhMekRohijf5sUpREtOsejav3pcAcw74XL7GnBp5f9NWUPZmLV4gjFKY1JZUcuxkOKukZ0GAjdUty7wih6v1ZWvlMhbqu76bcFrtH3raXVthuR9Ce45dMpGT2Lofjy8ZAYvCaN02nceaj8V_4-gQkU0oi3tcWXbpEIhRrTahmCzUVQbqejG5cG5HyCN_W-y0HKRBvAy3Lvmlk5vLJsayysaErDZtMbJzOY743zDmpZTJ3p-v3vEuut_tJ7fgxqn4EY72p5CGadHO8XUDsxzhACu5BO-unbeihWPcG4lSyqwEXzDJa43tWwwEwsief2E0SypjkajmYtZnqePu2ZbHPtPpCMnNdqG21flT9M-fQANmdTx3TidcknG83Oq5-dJL2z55JJ5cSqKeim0DKMZw2maZ48w7D6PWPrbJ2bf2hqbn-b5rT0tIpt0Z72n8dTTbUiy6DmelqK-vmttIveId28MPUWuCIkG7MkUOyUJCZ_C7hCq2aRc0Qbfj2mjmLj5SrezWfrskrDD1ORvmEJ6PfSOHJd7OnOzyjPyDDcnidcXyYSh6puwzKLlad9HT78cEm-p7Fu76l5IzoPNKyn5m8dGgrLMbnuwJy2bkFZXaRpNVvCX5e-9Lko1TgSuFRaau1G-CWbeM7wHXf6y_L13Ik-tC2HvQj5xAUOCtpN5_9xxw1pO97aU7Br6q_xYK9tX2PC9B2HIPlAeoBKi3pNi7AkuCCxwNZkMW3b4kL0XmekxZF4ZOs768Lu8uh6SX58h9QEDJ-VNnpMwy-aSPzheEjeD7vGHPSWdof2jZ6XmD7I5tT_AjPK8z-QszGgOM6rTMcxHML4LujBLj7sJnGYmGUUwmuwmS9m0jFP1UWiDBaGnOXzYnZ-L1vnoxyooHUUrnG7-OI8hxmMnerhHa8OB2xT6PV9fsZkP4K9d3K8fHLn3BLoKM-_9mGztCSoyFFFASLSxSetkdyiVwndWnX2OdUw-vOxPn8EleH59PLhjpOR2a6wVu7V1z3rAMSAvXJU3TEEyhZ5jhCkYvF9Gno78qVxx6scsvbQ2ZsnWS4LrnkP-w-BOlB-zSZjOvaGwz1OGqejLTpfgWl7LZ2H1LwMYb0L_Ubb9huZW-msYKvoT1DdhAaVxgMo-jYHZnIWa1oAJM_Jz2wm3zjfKxaJ9-Son7AfXgWDOK0y-b7aHrOcNKf9gwUl_vv4Kpp9X8_cnpMcH5eraJhPXn9Y9W5h_2BuF9WLnCplR4E0ziDTJqjR6T7p_Wfy9jpu0GHFTzLiJ0zofq3wf0l7Kl9HSf20231BPaqg7B_Z8eAwBWp7KhS1tTmAPHTYbst9Hkf-jwpqRjXbNh-p33Ng-2BiFmdHj4njUAnNuNwib4R7e2yblMZcqD5w_rSYvlge_ia0GcfhDVkMRilyyHvu5mB4tu7nAif9W6MFgdW97ZI-s9v_O5VimfoHmTM_bE1okaVy8bBpfH3c_LwuzY_kojTEZH8ufOnE9ntPjLeV3k0h63N33OPiNoVtavTtovrLCAv1Hq9wbSVdf8Ey_j8gTSm0N9BC_Lm3H9-qygfRJ9TDraBuM8pDlI2OMm5aT-vnnKBjBP1TQduFHw9JJ5lzE0_OK53Dxh6z0w0T8IatPTJsJEY-lGIcQaTFTPsN5CXd9HL0jgzCJRmUPmp70pWFBiughtKvR50ldeKIUfYj5X8jgCwvfA2eraVmVjk4b0LyiKCjJ3qKuepvqJw7hsfpB-RRrVW2rBFiUTw02nBQPgz1cUbtD5AmEaLwVzL8QK5I6BJsNZ5WVX6zMxuZPmx7TI19m2Y6H0-l4_g1ZkeYzs24u4vC3Tx8vlxu4gIvkCftpPrIfzSY5JzAB3vJ7nL73I_Tjj25B_SkNBWaHzcOXDEEtqRYBzAzAxHSY8ztwvGY4vVcJ4QJ83II72QFFG3lLrdknboDYIVrrt9kxDchxIQPdEUJprRfgI8BcS0Cwx3FDDWDuoo470Ac_dtRfFgvS0F0rdbAp4YC5W0nTW4f2JdO2K8eE1v7uGDMayB9ifLF0Ac7qC1QXqMBn9CLK4jhMoyJEZ7uLuqIUJqiCKK8rtI3rONzCNMy2WZLTbUHP2AUMYRLGYQYjlEO4yCGsqwxuYR4XSRZtgzikjaXYTuJCqpszd4XoIkJxhoozjivKtbtVDOHh7o27xbS0T3ql8sS6a4rJ6kxduIiouhsdxCFn2uijecMMd9eUl65vsgqSy89992QF1h_8TSWqPZsjHvxN3XPHJ1YUuDizzPY3fNy9n7NO8YvXX5vq3b69gP8XAAD__7JyAx0">