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

    <tr>
        <th>Summary</th>
        <td>
            Crash serializing (dangling) ImportDecls to PCH
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang:modules
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          sam-mccall
      </td>
    </tr>
</table>

<pre>
    The following crashes with an assertion:

```
clang -fmodule-map-file=m.modulemap main.c -Xclang -emit-pch

// main.c
#include "m.h"

// m.modulemap
module M { header "m.h" }

// m.h
// (empty, though it needn't be)
```

(Note no `-fmodules` here, but still using modulemaps e.g. for strict-decluse purposes).

Trace is:
```
clang-15: /usr/local/google/home/sammccall/src/llvm-project/clang/lib/Serialization/ASTWriter.cpp:5051: clang::ASTFileSignature clang::ASTWriter::WriteASTCore(clang::Sema &, llvm::StringRef, clang::Module *): Assertion `SubmoduleIDs.find(I->getImportedModule()) != SubmoduleIDs.end()' 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: /usr/local/google/home/sammccall/src/llvm-project/build/bin/clang-15 -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -mrelax-all --mrelax-relocations -disable-free -clear-ast-before-backend -main-file-name m.c -mrelocation-model static -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -mllvm -treat-scalable-fixed-error-as-warning -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/local/google/home/sammccall/src/llvm-project/build -resource-dir /usr/local/google/home/sammccall/src/llvm-project/build/lib/clang/16 -internal-isystem /usr/local/google/home/sammccall/src/llvm-project/build/lib/clang/16/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/12/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdebug-compilation-dir=/usr/local/google/home/sammccall/src/llvm-project/build -ferror-limit 19 -fgnuc-version=4.2.1 -fmodule-map-file=/usr/local/google/home/sammccall/m.modulemap -fcolor-diagnostics -emit-pch -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/m-9204c0.o -x c /usr/local/google/home/sammccall/m.c
1.      <eof> parser at end of file
 #0 0x0000000006625323 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /usr/local/google/home/sammccall/src/llvm-project/llvm/lib/Support/Unix/Signals.inc:569:13
 #1 0x00000000066231de llvm::sys::RunSignalHandlers() /usr/local/google/home/sammccall/src/llvm-project/llvm/lib/Support/Signals.cpp:105:18
 #2 0x00000000066256aa SignalHandler(int) /usr/local/google/home/sammccall/src/llvm-project/llvm/lib/Support/Unix/Signals.inc:407:1
 #3 0x00007f6ded23daa0 (/lib/x86_64-linux-gnu/libc.so.6+0x3daa0)
 #4 0x00007f6ded28957c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #5 0x00007f6ded23da02 gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #6 0x00007f6ded228469 abort ./stdlib/abort.c:81:7
 #7 0x00007f6ded228395 _nl_load_domain ./intl/loadmsgcat.c:1177:9
 #8 0x00007f6ded236ab2 (/lib/x86_64-linux-gnu/libc.so.6+0x36ab2)
 #9 0x00000000074831b8 clang::ASTWriter::WriteASTCore(clang::Sema&, llvm::StringRef, clang::Module*) /usr/local/google/home/sammccall/src/llvm-project/clang/lib/Serialization/ASTWriter.cpp:0:0
#10 0x000000000747dbfe clang::ASTWriter::WriteAST(clang::Sema&, llvm::StringRef, clang::Module*, llvm::StringRef, bool, bool) /usr/local/google/home/sammccall/src/llvm-project/clang/lib/Serialization/ASTWriter.cpp:4493:23
#11 0x00000000074dc829 operator-> /usr/include/c++/v1/__memory/shared_ptr.h:816:16
#12 0x00000000074dc829 clang::PCHGenerator::HandleTranslationUnit(clang::ASTContext&) /usr/local/google/home/sammccall/src/llvm-project/clang/lib/Serialization/GeneratePCH.cpp:68:3
```

The crash is while trying to serialize the implicit `ImportDecl` produced by the `#include` of a header covered by a modulemap. The ASTWriter wants to emit the ID of the module, but it does not exist.

A special case was added in 17da34d2bd42e763ad9995a01a5d8784137a476c which says "don't record this module if we're building a PCH (and some other conditions)". It's firing and shouldn't be.

I don't really understand the intuition behind this special case so don't know how to fix it. I hope @bcardosolopes can help out :-) Meanwhile I'll probably just find a way to narrow it somehow so it stops crashing in the configurations we're hitting.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzFWFtz27oR_jXyC4YcXiRSfNCDY8Unnmk6mdjt6ZsGBCAKCUlwADC2--v7LUhZVqKeSU6T04xDkcDi28XesIvayOfNw0GxvWlb86j7hgnL3UE59qj9gfGeceeU9dr0i_x6kWwXyfFZJPNf-BQtx-Jo3xk5tirq-BDtdasW-baLpzEMsY7rPhYs-tdMrjrto0EczoCzW_zNpMehXPeiHaViiyzr4gOel5acOE3j0yd7zxblG3ZQXCp7AsDg9iLI4ex7ka1VN_jnRXbD_MGMzYFpz3qlZL_ISs9qtciqiyo5wqz_brxivWGYOSrI4R0SWUWw9eiZ87pt2ejIBC-7cEzFTQzjWMxbLXwkFdTgFBtGOxgHmKyKX3N7sFwopt3JWBfMFKUrzGNnt6OzeLZG8Ba_jTENTJbdHkxHP453ncAUzTkriLL90kWDNZ-U8PgMaDSsazzvldW81f_mwVuy2-v7h9-t9srGYhjAcJWsUuI7rYKA-TVIbuEl97rpuR-t-mpuWj59hneM3RhS2voV4T1Uhc0UpEoScB6Fwvrmo9rT8Cvq95NPLLJrshvEuT46ONnnfqwn7d9tXbzXvQSru2iRv22Uv-sGY72SEwImCCCrAIVtbdnZUhVWBoKS7Tn2KGc7ffjb2-v7t8yBGn7EYfyGWUXIzBt28H4IxgvO1yAGxzoWppt1_60JtHMjucEtYlWyY5R4hHQIZFZz8dmTU5AaBjCyRijsWDJnRjsN00qEuRGaY3vMjj1zwurBzyLfe4AwOXbDi1slmKo-WNNY3jFum7FTvXc_x6vqUbeSfnV_9DF4LIuESFkEqw4w39O62BXLaOw_9-axj1rdj09R049zSjH1JxZ1VrX8KQInFh0_8IRYZG3HIqkdr5Gs9lYpwLeK24g7H9UKEaciUh3sCCCkopDNop53ChlCTOAzUgSzqxYRii-a2UMnKhqM7oPzboMA-477Q6SsRR6I9vshEqYnu3gQwPWifW8ia8ZewmkjogUQSBD2o_AGcrWaI95BOPbI0zLyJDo0vs2gFFhA-UgMIykmKpYYGnsVBhrVIy5JLlIzKVBxHzkYYNq7flKS5CIeLnrktqcUhEQDx2yUJSBNsbNtZA3uwnxRljfANt2g20kBUtM-f5LlGYw0-Sbh_kR_mrLUMWelBYuChXreRto9O6-6X8iMQnUOzu9g-z2kgUEjSIY5Gl6igDhmeMTxt48LtN9yU0_0Ir7lOpNewPnj1T_OAr4WfPBXOtp-8vtWUypOKwxgIyKCh7tQ8GyXcRanF6uaH5LhdQlEIdSCqdS86Q2OfeFOdRBmuZTgjgjc7na_3dzs3l3_8-1u-_v1x9tsd3N7t7u-fw_2EMqQyjxyMvCjKkuWIomRW56Y-DE37o5VVko5fZHfKLPHgccGbnEwMu4ZJUGzZ2HngRIM8oQlT8nxX1FkqzzLXx2_sOr08gHHsA8nyMN0DK1PRJY_7qACZKRuPr9BOx2p_6uFj6flVJmMAx2wePtHr59ogAqO1sXwNSpMCioE0vy0ufSrzeUpHPLC5j6O_QT1DmdoC7eZDv1fJ_9R8KmiShMq5NL1SfDsa6sUnLMzESHh_0XJy6QkWU-i5rOo5b6QSma55DxhQX8z4IVMhQkROxPDV94kT2HJS_VNmMtzzHW1KgXb7QZ_gI_J3WfU2DvdoYCgciWkFEY5sR887fE1WRxkXuJRFif81TcyJxlrXNhoQJpej7kWfiLVQNUZivWgE8u1UwE7I3W8gi7OobP1sqgYr6kuDFBeTloJQwFhTdV0eUIov0bIqxXb9e2uNdiUNFTGBCzYvw1m57JzDYqYAJemJYn0Spvrr3Zb8Dr7QQvRkjMLVa8dtFyu87Re_-mq_weL_qnm_8v7niT8PzayaXKugVLW--_pe37O7v8reW1Me_r965W0XFY5RUV-UlR6rigp1pDLDCg_qSCmI-pCWQJB3oS_2y8pHrtdpzpjn0nIA7dKIhdYdPgUPQU5fXHil13i90qNH27e_UbFNLGfRqaUinOtd1OBgsznzw0VfBc1z5MP5vr1ip1FVJB2Vm2xxiP_gyuKh5duUTv2eMAxz7x9pjYAHamb8aemkpKnFqiWADH1w1slWrrMgHxyFGgf6-dASTxerm2IABUEP17ChC5iouWn646YkSQvnsEeOXpKkoHKowB6tyUYeutmn55uTzAtDbqj3qBaedLOn12KXDM3KDS3LRPooQDrGKosRe0yS0vJ86XMarnMVFnkXFZVteJJyldyXa6XaV7yZVkI0gvqM8efHV0hSTPd_lgljJWQCJqbb5v0nj1CsNIqFspM0iNnMAelTmq1HezMDDZBekDDF7rRcFWQxewOFi4dai0b1hH5wYzty2XT2cbu2EkOOMwzQ_-IIsTTsmCt3o8BHgsPup_lPFOGMy8Y1EqzA_5D42gLoVSIg4EBxlwmteBWGofadYCiBe9hy3ZgBtqHe0Xk2u8V7yf3uQMgul74RI0u85l9Gp1ndJ0CTTzyZ-LQc9Tej2Q50gexhSj05c3gJnckDcBE4TLD9HvdjHZu3Y8KPmjvQRVfqU1aFOsiyVd5cSU3uazyil957Vu1uQmuffRjAoUhJGKopcYWcp8cOXgbTHU12nbz5-9iVlWSlVeHTaHUXiyrKqlVLlNRqnWdZRgpkCJkvi-v0IOr1m0WKySs7Jg1jjeEWbZYba_0JkuyLE3TIs1W61URl1kl67Socq6SSvIatkHw6DYmaWJjmyu7CYKheXKYbBEO7jTJHdUoSgWmwOejPxi7QdaJprRzFbaxCXv4D1SXCxQ">