Issue 202289
Summary [clangd][clang] crash in ASTWriterDecl::VisitClassTemplateSpecializationDecl with missing header include
Labels clang
Assignees
Reporter hongtaihu
    This input is generated by a fuzzer.

It involves include three headers:
```cxx
#include <functional>
#include <missing_header>
#include <ranges>
```
use clangd to 
```
clangd -check
```
and use
```
-std=c++20
```

will cause the assertion
```
!D->getExplicitSpecializationInfo()
```


When the `#include <missing_header>` is excluded however, it does not crash. 



stacktrace
```
I[15:56:42.231] Building preamble...
clangd: <REPO_ROOT>tmp/llvm-project-main-20260608-latest/clang/lib/Serialization/ASTWriterDecl.cpp:1953: void clang::ASTDeclWriter::VisitClassTemplateSpecializationDecl(clang::ClassTemplateSpecializationDecl*): Assertion `!D->getExplicitSpecializationInfo()' failed.

 #0 0x00005b00247e55e2 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/llvm/lib/Support/Unix/Signals.inc:885:3
 #1 0x00005b00247e235c llvm::sys::RunSignalHandlers() <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/llvm/lib/Support/Signals.cpp:108:20
 #2 0x00005b00247e2bd1 SignalHandler(int, siginfo_t*, void*) <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/llvm/lib/Support/Unix/Signals.inc:448:14
 #3 0x00007e4a66645330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
 #4 0x00007e4a6669eb2c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #5 0x00007e4a6669eb2c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #6 0x00007e4a6669eb2c pthread_kill ./nptl/pthread_kill.c:89:10
 #7 0x00007e4a6664527e raise ./signal/../sysdeps/posix/raise.c:27:6
 #8 0x00007e4a666288ff abort ./stdlib/abort.c:81:7
 #9 0x00007e4a6662881b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#10 0x00007e4a6663b517 (/lib/x86_64-linux-gnu/libc.so.6+0x3b517)
#11 0x00005b002663e5af clang::ASTDeclWriter::VisitClassTemplateSpecializationDecl(clang::ClassTemplateSpecializationDecl*) <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/clang/lib/Serialization/ASTWriterDecl.cpp:1953:5
#12 0x00005b002663f303 decltype(auto) llvm::dyn_cast<clang::DeclaratorDecl, clang::Decl>(clang::Decl*) <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/llvm/include/llvm/Support/Casting.h:656:3
#13 0x00005b002663f303 clang::ASTDeclWriter::Visit(clang::Decl*) <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/clang/lib/Serialization/ASTWriterDecl.cpp:449:42
#14 0x00005b002663f757 clang::ASTDeclWriter::Emit(clang::Decl*) <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/clang/lib/Serialization/ASTWriterDecl.cpp:65:12
#15 0x00005b002663f757 clang::ASTWriter::WriteDecl(clang::ASTContext&, clang::Decl*) <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/clang/lib/Serialization/ASTWriterDecl.cpp:3113:27
#16 0x00005b0026629935 clang::ASTWriter::WriteDeclAndTypes(clang::ASTContext&) <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/clang/lib/Serialization/ASTWriter.cpp:6399:18
#17 0x00005b002662b7df clang::ASTWriter::WriteASTCore(clang::Sema*, llvm::StringRef, clang::Module*) <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/clang/lib/Serialization/ASTWriter.cpp:6241:22
#18 0x00005b002662c512 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>::_M_data() const /usr/include/c++/13/bits/basic_string.h:223:28
#19 0x00005b002662c512 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>::_M_set_length(unsigned long) /usr/include/c++/13/bits/basic_string.h:257:29
#20 0x00005b002662c512 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>::clear() /usr/include/c++/13/bits/basic_string.h:1212:22
#21 0x00005b002662c512 clang::ASTWriter::WriteAST(llvm::PointerUnion<clang::Sema*, clang::Preprocessor*>, llvm::StringRef, clang::Module*, llvm::StringRef) <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/clang/lib/Serialization/ASTWriter.cpp:5538:28
#22 0x00005b0026650af3 std::__shared_ptr<clang::PCHBuffer, (__gnu_cxx::_Lock_policy)2>::get() const /usr/include/c++/13/bits/shared_ptr_base.h:1666:16
#23 0x00005b0026650af3 std::__shared_ptr_access<clang::PCHBuffer, (__gnu_cxx::_Lock_policy)2, false, false>::_M_get() const /usr/include/c++/13/bits/shared_ptr_base.h:1363:69
#24 0x00005b0026650af3 std::__shared_ptr_access<clang::PCHBuffer, (__gnu_cxx::_Lock_policy)2, false, false>::operator->() const /usr/include/c++/13/bits/shared_ptr_base.h:1357:15
#25 0x00005b0026650af3 clang::PCHGenerator::HandleTranslationUnit(clang::ASTContext&) <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/clang/lib/Serialization/GeneratePCH.cpp:85:9
#26 0x00005b0026650af3 clang::PCHGenerator::HandleTranslationUnit(clang::ASTContext&) <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/clang/lib/Serialization/GeneratePCH.cpp:69:6
#27 0x00005b0026498a12 clang::PCHGenerator::hasEmittedPCH() const <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/clang/include/clang/Serialization/ASTWriter.h:1042:47
#28 0x00005b0026498a12 (anonymous namespace)::PrecompilePreambleConsumer::HandleTranslationUnit(clang::ASTContext&) <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/clang/lib/Frontend/PrecompiledPreamble.cpp:308:23
#29 0x00005b002666837c clang::ParseAST(clang::Sema&, bool, bool) <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/clang/lib/Parse/ParseAST.cpp:183:34
#30 0x00005b002645ea41 clang::FrontendAction::Execute() <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/clang/lib/Frontend/FrontendAction.cpp:1346:38
#31 0x00005b0026497806 llvm::Error::getPtr() const <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/llvm/include/llvm/Support/Error.h:278:51
#32 0x00005b0026497806 llvm::Error::operator bool() <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/llvm/include/llvm/Support/Error.h:241:22
#33 0x00005b0026497806 clang::PrecompiledPreamble::Build(clang::CompilerInvocation const&, llvm::MemoryBuffer const*, clang::PreambleBounds, llvm::IntrusiveRefCntPtr<clang::DiagnosticsEngine>, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>, std::shared_ptr<clang::PCHContainerOperations>, bool, llvm::StringRef, clang::PreambleCallbacks&) <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/clang/lib/Frontend/PrecompiledPreamble.cpp:531:39
#34 0x00005b0025e4b2ba llvm::IntrusiveRefCntPtr<clang::DiagnosticsEngine>::release() <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/llvm/include/llvm/ADT/IntrusiveRefCntPtr.h:232:9
#35 0x00005b0025e4b2ba llvm::IntrusiveRefCntPtr<clang::DiagnosticsEngine>::~IntrusiveRefCntPtr() <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/llvm/include/llvm/ADT/IntrusiveRefCntPtr.h:196:34
#36 0x00005b0025e4b2ba clang::clangd::buildPreamble(llvm::StringRef, clang::CompilerInvocation, clang::clangd::ParseInputs const&, bool, std::function<void (clang::clangd::CapturedASTCtx, std::shared_ptr<clang::include_cleaner::PragmaIncludes const>)>, clang::clangd::PreambleBuildStats*) <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/clang-tools-extra/clangd/Preamble.cpp:642:54
#37 0x00005b0025bdaefd std::__shared_count<(__gnu_cxx::_Lock_policy)2>::_M_swap(std::__shared_count<(__gnu_cxx::_Lock_policy)2>&) /usr/include/c++/13/bits/shared_ptr_base.h:1099:25
#38 0x00005b0025bdaefd std::__shared_ptr<clang::clangd::PreambleData const, (__gnu_cxx::_Lock_policy)2>::swap(std::__shared_ptr<clang::clangd::PreambleData const, (__gnu_cxx::_Lock_policy)2>&) /usr/include/c++/13/bits/shared_ptr_base.h:1687:21
#39 0x00005b0025bdaefd std::__shared_ptr<clang::clangd::PreambleData const, (__gnu_cxx::_Lock_policy)2>::operator=(std::__shared_ptr<clang::clangd::PreambleData const, (__gnu_cxx::_Lock_policy)2>&&) /usr/include/c++/13/bits/shared_ptr_base.h:1620:35
#40 0x00005b0025bdaefd std::shared_ptr<clang::clangd::PreambleData const>::operator=(std::shared_ptr<clang::clangd::PreambleData const>&&) /usr/include/c++/13/bits/shared_ptr.h:440:36
#41 0x00005b0025bdaefd buildAST <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/clang-tools-extra/clangd/tool/Check.cpp:257:10
#42 0x00005b0025bdaefd clang::clangd::check(llvm::StringRef, clang::clangd::ThreadsafeFS const&, clang::clangd::ClangdLSPServer::Options const&) <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/clang-tools-extra/clangd/tool/Check.cpp:525:18
#43 0x00005b0025bd1e8b clang::clangd::clangdMain(int, char**) <REPO_ROOT>/tmp/llvm-project-main-20260608-latest/clang-tools-extra/clangd/tool/ClangdMain.cpp:1039:16
#44 0x00007e4a6662a1ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#45 0x00007e4a6662a28b call_init ./csu/../csu/libc-start.c:128:20
#46 0x00007e4a6662a28b __libc_start_main ./csu/../csu/libc-start.c:347:5
#47 0x00005b00246ced95 _start (tmp/build-assert-clangd-main-20260608-latest/bin/clangd+0x374d95)
timeout: the monitored command dumped core
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to