Skip to content

[clang] crash on invalid code involving constrained variable template #73885

Closed
@XDeme1

Description

clangd 18 keeps crashing while typing template<typename T> above a constrained variable template when there is a explicit variable template instanciation below.

template <typename T>
concept Test = true;

template<typename T>
//! e constant.
template <typename T>
  requires(Test<T>)
constexpr T e_v = 2.718281828'4590452353'6028747135L;

constexpr double e = e_v<double>;

or

template <typename T>
concept Test = true;

template<typename T>
//! e constant.
template <Test T> constexpr T e_v = 2.718281828'4590452353'6028747135L;

constexpr double e = e_v<double>;

Crash report:

[ERROR][2023-11-29 22:28:38] .../vim/lsp/rpc.lua:675	"rpc"	"/usr/local/bin/clangd"	"stderr"	"PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.\t/home/fernando/Codes/cpp/libs/test/main.cpp:8:33: current parser token ';'
"

[ERROR][2023-11-29 22:28:38] .../vim/lsp/rpc.lua:675	"rpc"	"/usr/local/bin/clangd"	"stderr"	" #0 0x000056129f5aca88 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/local/bin/clangd+0x3e95a88)
 #1 0x000056129f5aa98c llvm::sys::RunSignalHandlers() (/usr/local/bin/clangd+0x3e9398c)
 #2 0x000056129f5ad3d8 SignalHandler(int) Signals.cpp:0:0
 #3 0x00007f727985c710 (/usr/lib/libc.so.6+0x3e710)
 #4 0x000056129f7a7757 clang::StmtVisitorBase<llvm::make_const_ptr, (anonymous namespace)::IntExprEvaluator, bool>::Visit(clang::Stmt const*) ExprConstant.cpp:0:0
 #5 0x000056129f73915b Evaluate(clang::APValue&, (anonymous namespace)::EvalInfo&, clang::Expr const*) ExprConstant.cpp:0:0
 #6 0x000056129f735606 EvaluateInPlace(clang::APValue&, (anonymous namespace)::EvalInfo&, (anonymous namespace)::LValue const&, clang::Expr const*, bool) ExprConstant.cpp:0:0
 #7 0x000056129f735083 clang::Expr::EvaluateAsConstantExpr(clang::Expr::EvalResult&, clang::ASTContext const&, clang::Expr::ConstantExprKind) const (/usr/local/bin/clangd+0x401e083)
 #8 0x000056129fd89cd8 clang::ActionResult<clang::Expr*, true> calculateConstraintSatisfaction<calculateConstraintSatisfaction(clang::Sema&, clang::NamedDecl const*, clang::SourceLocation, clang::MultiLevelTemplateArgumentList const&, clang::Expr const*, clang::ConstraintSatisfaction&)::$_0>(clang::Sema&, clang::Expr const*, clang::ConstraintSatisfaction&, calculateConstraintSatisfaction(clang::Sema&, clang::NamedDecl const*, clang::SourceLocation, clang::MultiLevelTemplateArgumentList const&, clang::Expr const*, clang::ConstraintSatisfaction&)::$_0&&) SemaConcept.cpp:0:0
 #9 0x000056129fd8439f CheckConstraintSatisfaction(clang::Sema&, clang::NamedDecl const*, llvm::ArrayRef<clang::Expr const*>, llvm::SmallVectorImpl<clang::Expr*>&, clang::MultiLevelTemplateArgumentList const&, clang::SourceRange, clang::ConstraintSatisfaction&) SemaConcept.cpp:0:0
#10 0x000056129fd84130 clang::Sema::CheckConstraintSatisfaction(clang::NamedDecl const*, llvm::ArrayRef<clang::Expr const*>, llvm::SmallVectorImpl<clang::Expr*>&, clang::MultiLevelTemplateArgumentList const&, clang::SourceRange, clang::ConstraintSatisfaction&) (/usr/local/bin/clangd+0x466d130)
#11 0x000056129fd86691 clang::Sema::EnsureTemplateArgumentListConstraints(clang::TemplateDecl*, clang::MultiLevelTemplateArgumentList const&, clang::SourceRange) (/usr/local/bin/clangd+0x466f691)
#12 0x00005612a017d90c clang::Sema::CheckTemplateArgumentList(clang::TemplateDecl*, clang::SourceLocation, clang::TemplateArgumentListInfo&, bool, llvm::SmallVectorImpl<clang::TemplateArgument>&, llvm::SmallVectorImpl<clang::TemplateArgument>&, bool, bool*) (/usr/local/bin/clangd+0x4a6690c)
#13 0x00005612a018333d clang::Sema::CheckVarTemplateId(clang::VarTemplateDecl*, clang::SourceLocation, clang::SourceLocation, clang::TemplateArgumentListInfo const&) (/usr/local/bin/clangd+0x4a6c33d)
#14 0x00005612a0184863 clang::Sema::BuildTemplateIdExpr(clang::CXXScopeSpec const&, clang::SourceLocation, clang::LookupResult&, bool, clang::TemplateArgumentListInfo const*) (/usr/local/bin/clangd+0x4a6d863)
#15 0x000056129fc67358 clang::Sema::ActOnIdExpression(clang::Scope*, clang::CXXScopeSpec&, clang::SourceLocation, clang::UnqualifiedId&, bool, bool, clang::CorrectionCandidateCallback*, bool, clang::Token*) (/usr/local/bin/clangd+0x4550358)
#16 0x00005612a2e86f6a clang::Parser::tryParseCXXIdExpression(clang::CXXScopeSpec&, bool, clang::Token&) (/usr/local/bin/clangd+0x776ff6a)
#17 0x00005612a2e88041 clang::Parser::ParseCXXIdExpression(bool) (/usr/local/bin/clangd+0x7771041)
#18 0x00005612a2e7b3c7 clang::Parser::ParseCastExpression(clang::Parser::CastParseKind, bool, bool&, clang::Parser::TypeCastState, bool, bool*) (/usr/local/bin/clangd+0x77643c7)
#19 0x00005612a2e7bc25 clang::Parser::ParseCastExpression(clang::Parser::CastParseKind, bool, bool&, clang::Parser::TypeCastState, bool, bool*) (/usr/local/bin/clangd+0x7764c25)
#20 0x00005612a2e7565f clang::Parser::ParseAssignmentExpression(clang::Parser::TypeCastState) (/usr/local/bin/clangd+0x775e65f)
#21 0x00005612a2eb9a6e clang::Parser::ParseDeclarationAfterDeclaratorAndAttributes(clang::Declarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::ForRangeInit*) (/usr/local/bin/clangd+0x77a2a6e)
#22 0x00005612a2eb71e4 clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::ParsedAttributes&, clang::SourceLocation*, clang::Parser::ForRangeInit*) (/usr/local/bin/clangd+0x77a01e4)
#23 0x00005612a2e5b6cf clang::Parser::ParseDeclOrFunctionDefInternal(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec&, clang::AccessSpecifier) (/usr/local/bin/clangd+0x77446cf)
#24 0x00005612a2e5b0d1 clang::Parser::ParseDeclarationOrFunctionDefinition(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*, clang::AccessSpecifier) (/usr/local/bin/clangd+0x77440d1)
#25 0x00005612a2e5a3b6 clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*) (/usr/local/bin/clangd+0x77433b6)
#26 0x00005612a2e588c6 clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) (/usr/local/bin/clangd+0x77418c6)
#27 0x00005612a2e5491e clang::ParseAST(clang::Sema&, bool, bool) (/usr/local/bin/clangd+0x773d91e)
#28 0x00005612a2b02cb7 clang::FrontendAction::Execute() (/usr/local/bin/clangd+0x73ebcb7)
#29 0x00005612a05ac887 clang::clangd::ParsedAST::build(llvm::StringRef, clang::clangd::ParseInputs const&, std::unique_ptr<clang::CompilerInvocation, std::default_delete<clang::CompilerInvocation>>, llvm::ArrayRef<clang::clangd::Diag>, std::shared_ptr<clang::clangd::PreambleData const>) (/usr/local/bin/clangd+0x4e95887)
#30 0x00005612a0642c86 clang::clangd::(anonymous namespace)::ASTWorker::generateDiagnostics(std::unique_ptr<clang::CompilerInvocation, std::default_delete<clang::CompilerInvocation>>, clang::clangd::ParseInputs, std::vector<clang::clangd::Diag, std::allocator<clang::clangd::Diag>>) TUScheduler.cpp:0:0
#31 0x00005612a06465da void llvm::detail::UniqueFunctionBase<void>::CallImpl<clang::clangd::(anonymous namespace)::ASTWorker::update(clang::clangd::ParseInputs, clang::clangd::WantDiagnostics, bool)::$_0>(void*) TUScheduler.cpp:0:0
#32 0x00005612a063f150 clang::clangd::(anonymous namespace)::ASTWorker::runTask(llvm::StringRef, llvm::function_ref<void ()>) TUScheduler.cpp:0:0
#33 0x00005612a063ebb8 void llvm::detail::UniqueFunctionBase<void>::CallImpl<clang::clangd::(anonymous namespace)::ASTWorker::create(llvm::StringRef, clang::clangd::GlobalCompilationDatabase const&, clang::clangd::TUScheduler::ASTCache&, clang::clangd::TUScheduler::HeaderIncluderCache&, clang::clangd::AsyncTaskRunner*, clang::clangd::Semaphore&, clang::clangd::TUScheduler::Options const&, clang::clangd::ParsingCallbacks&)::$_0>(void*) TUScheduler.cpp:0:0
#34 0x00005612a07a3c72 void* llvm::thread::ThreadProxy<std::tuple<clang::clangd::AsyncTaskRunner::runAsync(llvm::Twine const&, llvm::unique_function<void ()>)::$_1>>(void*) Threading.cpp:0:0
#35 0x00007f72798aa9eb (/usr/lib/libc.so.6+0x8c9eb)
#36 0x00007f727992e7cc (/usr/lib/libc.so.6+0x1107cc)
Signalled during AST worker action: Update
  Filename: /home/fernando/Codes/cpp/libs/test/main.cpp
  Directory: /home/fernando/Codes/cpp/libs/test/build/Debug
  Command Line: /usr/bin/g++ --driver-mode=g++ -g -std=gnu++20 -o CMakeFiles/test_clangd.dir/main.cpp.o -c -resource-dir=/usr/local/lib/clang/18 -- /home/fernando/Codes/cpp/libs/test/main.cpp
  Version: 33
"

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions