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

    <tr>
        <th>Summary</th>
        <td>
            Assertion `PrevDecl->TypeForDecl && "previous declaration has no type"' when compiling boost::asio in two modules
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    Given the following valid files:

header.hpp:
```cpp
namespace n {

template<typename>
struct s0 {
        static int m;
};

template<typename T>
struct s1 {
        using type = s0<T>;
};

}

template<typename T>
void require(n::s1<T>) {
}
```

a.cpp
```cpp
module;

#include "header.hpp"

export module a;
```

b.cpp
```cpp
module;

#include "header.hpp"

export module b;

import a;
```

And compiling with

```shell
clang++ -std=c++20 -x c++-module -fmodule-output=a.pcm --precompile -c a.cpp
clang++ -std=c++20 -x c++-module -fmodule-output=b.pcm -fmodule-file=a=a.pcm -o /dev/null -c b.cpp
```

Causes clang trunk to crash with

```console
clang-16: llvm/clang/lib/AST/ASTContext.cpp:4671: clang::QualType clang::ASTContext::getInjectedClassNameType(clang::CXXRecordDecl *, clang::QualType) const: Assertion `PrevDecl->TypeForDecl && "previous declaration has no type"' 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: clang-16 -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -main-file-name b.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=build -resource-dir llvm/build/lib/clang/17 -std=c++20 -fdebug-compilation-dir=build -ferror-limit 19 -fgnuc-version=4.2.1 -fcolor-diagnostics -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /dev/null -x pcm b.pcm
1.      <eof> parser at end of file
 #0 0x00005639235186d1 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (llvm/build/bin/clang-16+0x446b6d1)
 #1 0x000056392351633e llvm::sys::RunSignalHandlers() (llvm/build/bin/clang-16+0x446933e)
 #2 0x0000563923518ab6 SignalHandler(int) Signals.cpp:0:0
 #3 0x00007fbc9584fab0 (/usr/lib/libc.so.6+0x39ab0)
 #4 0x00007fbc9589f26c (/usr/lib/libc.so.6+0x8926c)
 #5 0x00007fbc9584fa08 raise (/usr/lib/libc.so.6+0x39a08)
 #6 0x00007fbc95838538 abort (/usr/lib/libc.so.6+0x22538)
 #7 0x00007fbc9583845c (/usr/lib/libc.so.6+0x2245c)
 #8 0x00007fbc958483d6 (/usr/lib/libc.so.6+0x323d6)
 #9 0x000056392651cce4 clang::ASTContext::getInjectedClassNameType(clang::CXXRecordDecl*, clang::QualType) const (llvm/build/bin/clang-16+0x746fce4)
#10 0x00005639242daada clang::ASTDeclReader::VisitClassTemplateDecl(clang::ClassTemplateDecl*) (llvm/build/bin/clang-16+0x522dada)
#11 0x00005639242c60bf clang::ASTDeclReader::Visit(clang::Decl*) (llvm/build/bin/clang-16+0x52190bf)
#12 0x00005639242f08ac clang::ASTReader::ReadDeclRecord(unsigned int) (llvm/build/bin/clang-16+0x52438ac)
#13 0x0000563924278984 clang::ASTReader::GetDecl(unsigned int) (llvm/build/bin/clang-16+0x51cb984)
#14 0x00005639242ac5e3 clang::serialization::BasicReaderBase<clang::ASTRecordReader>::readTemplateName() ASTReader.cpp:0:0
#15 0x00005639242b782a clang::serialization::AbstractTypeReader<clang::ASTRecordReader>::readTemplateSpecializationType() ASTReader.cpp:0:0
#16 0x000056392427d964 clang::ASTReader::readTypeRecord(unsigned int) (llvm/build/bin/clang-16+0x51d0964)
#17 0x000056392427707a clang::ASTReader::GetType(unsigned int) (llvm/build/bin/clang-16+0x51ca07a)
#18 0x00005639242b785e clang::serialization::AbstractTypeReader<clang::ASTRecordReader>::readTemplateSpecializationType() ASTReader.cpp:0:0
#19 0x000056392427d964 clang::ASTReader::readTypeRecord(unsigned int) (llvm/build/bin/clang-16+0x51d0964)
#20 0x000056392427707a clang::ASTReader::GetType(unsigned int) (llvm/build/bin/clang-16+0x51ca07a)
#21 0x00005639242b5ca4 clang::serialization::AbstractTypeReader<clang::ASTRecordReader>::readInjectedClassNameType() ASTReader.cpp:0:0
#22 0x000056392427d964 clang::ASTReader::readTypeRecord(unsigned int) (llvm/build/bin/clang-16+0x51d0964)
#23 0x000056392427707a clang::ASTReader::GetType(unsigned int) (llvm/build/bin/clang-16+0x51ca07a)
#24 0x00005639242c6151 clang::ASTDeclReader::Visit(clang::Decl*) (llvm/build/bin/clang-16+0x5219151)
#25 0x00005639242f08ac clang::ASTReader::ReadDeclRecord(unsigned int) (llvm/build/bin/clang-16+0x52438ac)
#26 0x0000563924278984 clang::ASTReader::GetDecl(unsigned int) (llvm/build/bin/clang-16+0x51cb984)
#27 0x00005639242f5993 clang::DeclContext* clang::ASTReader::ReadDeclAs<clang::DeclContext>(clang::serialization::ModuleFile&, llvm::SmallVector<unsigned long, 64u> const&, unsigned int&) ASTReaderDecl.cpp:0:0
#28 0x00005639242c6b1b clang::ASTDeclReader::VisitDecl(clang::Decl*) (llvm/build/bin/clang-16+0x5219b1b)
#29 0x00005639242c91af clang::ASTDeclReader::VisitValueDecl(clang::ValueDecl*) (llvm/build/bin/clang-16+0x521c1af)
#30 0x00005639242c95c0 clang::ASTDeclReader::VisitDeclaratorDecl(clang::DeclaratorDecl*) (llvm/build/bin/clang-16+0x521c5c0)
#31 0x00005639242d184b clang::ASTDeclReader::VisitVarDeclImpl(clang::VarDecl*) (llvm/build/bin/clang-16+0x522484b)
#32 0x00005639242c60bf clang::ASTDeclReader::Visit(clang::Decl*) (llvm/build/bin/clang-16+0x52190bf)
#33 0x00005639242f08ac clang::ASTReader::ReadDeclRecord(unsigned int) (llvm/build/bin/clang-16+0x52438ac)
#34 0x0000563924278984 clang::ASTReader::GetDecl(unsigned int) (llvm/build/bin/clang-16+0x51cb984)
#35 0x00005639242f12cc clang::ASTReader::PassInterestingDeclsToConsumer() (llvm/build/bin/clang-16+0x52442cc)
#36 0x00005639242872fc non-virtual thunk to clang::ASTReader::StartTranslationUnit(clang::ASTConsumer*) (llvm/build/bin/clang-16+0x51da2fc)
#37 0x0000563925787dd4 clang::ParseAST(clang::Sema&, bool, bool) (llvm/build/bin/clang-16+0x66dadd4)
#38 0x0000563923d58966 clang::CodeGenAction::ExecuteAction() (llvm/build/bin/clang-16+0x4cab966)
#39 0x00005639241a6f1e clang::FrontendAction::Execute() (llvm/build/bin/clang-16+0x50f9f1e)
#40 0x0000563924110e0f clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (llvm/build/bin/clang-16+0x5063e0f)
#41 0x000056392423fce1 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (llvm/build/bin/clang-16+0x5192ce1)
#42 0x0000563921cb01df cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (llvm/build/bin/clang-16+0x2c031df)
#43 0x0000563921cab8fd ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#44 0x0000563921caa4a2 clang_main(int, char**, llvm::ToolContext const&) (llvm/build/bin/clang-16+0x2bfd4a2)
#45 0x0000563921cbce32 main (llvm/build/bin/clang-16+0x2c0fe32)
#46 0x00007fbc95839850 (/usr/lib/libc.so.6+0x23850)
#47 0x00007fbc9583990a __libc_start_main (/usr/lib/libc.so.6+0x2390a)
#48 0x0000563921ca7be5 _start (llvm/build/bin/clang-16+0x2bfabe5)
clang++: error: unable to execute command: Aborted (core dumped)
clang++: error: clang frontend command failed due to signal (use -v to see invocation)
clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4cc2010f0368b71316acd5895f9a016e7f34c5fb)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: llvm/build/bin
clang++: note: diagnostic msg: 
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang++: note: diagnostic msg: /tmp/b-a16aec.cppm
clang++: note: diagnostic msg: /tmp/b-a16aec.sh
clang++: note: diagnostic msg: 

********************
```

The effect of this is that boost::asio cannot be used in a modular codebase. This issue started happening within the past two weeks or so.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMWl9z27qx_zT0yw41JPhH5IMfZNnKycxpj2-spn3zgMBSQkMCvAAo-9xPfwegZIm0XMtJmybj2BII7P6w_4ElNUZsJOJ1kN0E2e0V7e1W6WtOd4IbqyReVYr_ef1J7FCC3SLUqmnUk5Ab2NFGcKhFgyZIFkF0G0T731ukHPVs23XHB3k0_LCuG0YkbdF0lCFICOY3p-sttl1DLQbJ0v7ZoZsZJHfDM2N1zyyY6HRRaSy1goGQFtogOYzPb4-f3yIM61ek4xHp3rjNuukQJLdgoiBZ-jVvs3EjF3PdKcFB4__2QmNACulElixMfGBDyhM4L4QP4jzlQ2cvwn0t7lbxvsEpUJIIyZqeIwSEnKiNkNNp-NwpbWEgAfRI5ByK6uegqCZEROufvgNuITkw1XaicUp9EnY7AnJYYrbYNMMYa6jcBOQmIDcQGsuD5JYNX0kE4TPsv4R7WGE9fAhVb7veBsktnXWshTDsNA6cEUIGJ7r6YQ7VwOEw7jzS8T3yVhCQFcddQFaybxrH_5yWTkWxpL1BAx4bWN3Lb2AVME3N9m2xMSWNavBkW2GcB8kCmmbXBmS13-mqEVVAVouH9fB7qaTFZ-sRJYs0n8duzTDZO8P_9LRZOwc8GTuuG75v0H6W_0RmkS8basxfaYtuTUCKk1XLf_zjCzKl-S2yBgKyCMjyHCfndW43jjgsjEFthZIQ5NG9xp1bHAbJnZu5UnpPKw9I7gy407gTqjfAkTVUU79ySw1I5cOIM2syh5qKBvlsENb973eLhzswfdUKCxSqfgMavUVbBVtrOx9jySogq42w276aMeVEupes-xN2WjkBBGQljOnRBGQFVHI4OJcL34MGK8q-WU0Zuu13GjutGBqDHIzq9TDsVlJjFBPUIgfdSzBMi87uIT9Yyr4B79tjkI9mcK_VRtMWqN70LUprXlQZxjmEjMUQWi26BuG5yB_zNOzlN6meZNgI2T-HG9lDiK2woar-CWGrsaHPIXVGy4WhlbNvjc6FGqQ6pMaGFdZKY-j2hJJD2FIhvROEPtJ6Sx8oKeaV4TwJG-gEg7ATLGxwhw2Q4YswYScQwrbWtMWwU0Ja1M6XHIa6pXYbotZSQVjXXciUdIJ0bqgkhLVUoVa95EJuQjcXwtbbkcssSoe0EdT5VVj38klIHlq3JRMktwRCS_UGbci63skmzFMIbS_RD2xQonaAOVb9ZoPaPRLObG83vIKwZmqHmm4wHILMsFEuHPKqFw2HUOOgXDd68Ej_6MUjD_4Zz88Eotpzfpt8jVorHTbCWXBcQlhvZM_CHWojlAyS23RGZrFH2igdckE3UhkrmJMG5VwbsYHw9vHx03L5-Nvi693j7d8XX1bkcbn6_Lh4-EuQ3MZnQtkzuBDnQ-BghPEM_L8gWaKqg-QOOqoNaqAWnH2o2tcsw2QISBJB9BxFUZTlSUmSLC5yHg_yGTLxn2b4cK-FtN7q14PrFMdJmj49KmM10tYHgqUrRXzq3s86iroS8iBqFx3JTfScpnmV8zgg5RFVPEGVJwmeQ_Wllw9iI2nzG5W8QW0CUnyEcZkkOGJMpuKgVQ4jFgEp9rsbhs0-ckf-_wuhZE9oXleszIq0plUEHt2qN_rF6BpRsZlRswFRUtIqGuFJx2TKmuTsXTJFSXI2IpO9QhMVoKkweAmmqBgRy8fEkiJLCqCVC9fvESMkS8bE5lNiafb-BglJs_EGi8kGi4Tn72-NJDwfkSlP1Z9nMWOY_pvz7gVp9zLznad5zTB9we_cZuTNKeGUcjrB7zB88VXmMPRVGGE9-PW-Uh9Qjjbw-vHiYjfLCOGU0xHOeIyT5VFVX4JzDOvjSOIyquoREjJGUkcFZRMkpyjc5wGZ02dAil76IyT_UMjLSJoUlI2AJGMg86IspqZ3CuQT2r2evg9BzKqyGBtPOkZAWYbJKQKDWtBG_J9Pf8PQDTWCDbBuqHFnvCliJ6YD7rt9ukDKD8bkHGYfs182-DqgOnTZGF01Lwh9B92iMr48cc51wPBRgA8dsiPdvW9fADefqJOX-b9Sp2fpYf6QXcU8KvOxVucTIPNoPg0JE7vab_J77YpG87GzF680l-EvrLnyF9Ecif7bmiOTMF1ljKb_Qc29lUrfVxohv4rSpmH85ystnebWOIt_Tm6Ns3iEJPtFciuZBuOfnlvJJArXWVmOcqvjd6gsyeICIS3M2K9OCSR3Y12ecdO_-NuylTsKDie24-HqoaVN8xXdiT1Ili8SaJQ7HS8hT3t3rBzuh4a1YynlI3d1uM67bDG10yquLrHT1-Xp99hqFVcjBU2iPitjelFF-pU2_ZmK-WT4Q7hYTEf1aRJNcWUsulRKVFM7XNC9ltfps48hzFg0QjhJEjwu0ov0-JV69p_b7pXsvgMXSYt0pNGE_CpnjCT5ReJgkv6342AyTQkxYf9KFPfUmM_SokZjhdw4NGatlkqavvVXMR8RR0rYWByTtFDMSc1AKhnuhLY9bcBuD1f_byJ8sFTbtabSDNeCf5NTCxruDPaAP2BIMaekHgMeZZFsXsw5H-nvnmqDvrNwCuABW7qP1JVSzfHvhUjynFPOx3ocBe-EZ0WZ56dIlorjJ5QLdkw5d8_Ieov7oY_c0zFalXk-4j8O1zHN63h0plhplwslPwPgQ1YT1WUd4ynrdByR4zjCqB5v3fe59GdpLJUMz-_-baxDAr0QXp5gNAo26SQcJzXDUfm3B3JEuds3BiZXPtNdfMh0S8JwVAumo2gcsyqKeQ2MxY8tdQRObpMXWtM_v2Dt6pst1YdKY-HLmiWMx8gSdkrwj6AjLEpiPhZaMkZHq6LmcJDUMl57dynO1kg-f52DOimrHI19gXZSPJXAtdi9capJ0wksmlIy6PIgNh-PB6F4GSwuY3qZoKqap5SMBJVN1MgwIeCwXCz7GpMxyel1cllk79-Uk6TIRmVIOr1ILsuIwuOjW_ZoXJB-PMB8h3AZjc5TaTFRwrzCDAaSF8uRVpi9ED1peQfJAnznyH3oJa0adOkGB8sDptqWSu7bsJXSFrnjyJRG33pE_i7NoYVd7yPMgeC-_Qq89-yMb2Q40r1BCHd-DBHESWw45QP7thbE81k088r6WJN2thEWUsZIFEd1lORFNY-TOKfMJZKsLmkU5zivk5Rl9bGoW_sOodvVW83T_bytO96D73O62Z0y4nl45KNZ0yC_FfqkNX-qvHPilMq6MA7Hth20xgVKOJjJD_ycvEuwb4Qv1uvF8jdY_3YHqz9-__2Pv3_-6ydYff797gHWf_jhm799gi939398Wb-0n-_PNbIL47z9zWb2ywSN4PvDyIHaF5KXS4GsbNs5AYY0zikyF87aHyZitt-njX-XTs69GrLeImBdI7OgarBbYUAYsFtqXVFl9n0haoQCRqVUFiqE3vjSGejw_o7PFBwranAG64GE6RF8TEEOW9p1KA_v6Ijh1bOOGgv2ScET4jcDSoNRsyt-nfAyKekVXsd5kUalO25cba-R19WclCUrecoZTSrKS0YKQud1xMp5eiWuSUSSKIvTuCRZksyYb3m5qrgkFYkwSCNsqWhmzkdmSm-uPMjrnMyj7KqhFTbm8N6cvvbeXfUbE6RRI4w1x2VW2Aav_zOvkTxtUZ680jTVgBPdk9q_NGWuet1cf__bJH7j_x8AAP__VTLZ4A">