llvm / llvm/llvm-project

[clangd][clang]Assertion `E->containsErrors() && "valid value-dependent expression should never " "reach invalid code path."' failed.

Open
#201,427 1 comment 0 reactions 0 assignees View on GitHub
clang:frontend crash generated by fuzzer
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

This input is generated by a fuzzer.
Perhaps related to https://github.com/llvm/llvm-project/issues/107837.
source code:
```cxx
// RUN: %clang_cc1 -fsyntax-only -std=c++11 -code-completion-at=%s:%(line+11):9 %s -o - | FileCheck %s

// PR14381: need constexpr function bodies always, even if code-completing.
template struct S;
template<> struct S<1> {
typedef int type;
};
constexpr int f() {
return []() { return __builtin_sub_overflow(x, x, y); }();
}

S::
// CHECK: COMPLETION: type : type
```

command in the compile_commands.json:
```
--driver-mode=g++ -std=c++11 -fsyntax-only
```

use
```
clangd --check
```
to reproduce

stacktrace:
```
Stack dump:
0. Program arguments: /tmp/build-assert-clangd-main-20260506/bin/clangd --check=constexpr.cpp --log=verbose
1. parser at end of file
#0 0x000058267165c8f2 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /tmp/llvm-project-main-20260504/llvm/lib/Support/Unix/Signals.inc:884:3
#1 0x000058267165966c llvm::sys::RunSignalHandlers() /tmp/llvm-project-main-20260504/llvm/lib/Support/Signals.cpp:108:20
#2 0x0000582671659ee1 SignalHandler(int, siginfo_t*, void*) /tmp/llvm-project-main-20260504/llvm/lib/Support/Unix/Signals.inc:448:14
#3 0x000074d257c45330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
#4 0x000074d257c9eb2c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
#5 0x000074d257c9eb2c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
#6 0x000074d257c9eb2c pthread_kill ./nptl/pthread_kill.c:89:10
#7 0x000074d257c4527e raise ./signal/../sysdeps/posix/raise.c:27:6
#8 0x000074d257c288ff abort ./stdlib/abort.c:81:7
#9 0x000074d257c2881b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#10 0x000074d257c3b517 (/lib/x86_64-linux-gnu/libc.so.6+0x3b517)
#11 0x000058267189817d EvaluateDependentExpr(clang::Expr const*, (anonymous namespace)::EvalInfo&) /tmp/llvm-project-main-20260504/clang/lib/AST/ExprConstant.cpp:5610:3
#12 0x000058267191d5bf EvaluateStmt((anonymous namespace)::StmtResult&, (anonymous namespace)::EvalInfo&, clang::Stmt const*, clang::SwitchCase const*) /tmp/llvm-project-main-20260504/clang/lib/AST/ExprConstant.cpp:5992:14
#13 0x000058267191c9a9 EvaluateStmt((anonymous namespace)::StmtResult&, (anonymous namespace)::EvalInfo&, clang::Stmt const*, clang::SwitchCase const*) /tmp/llvm-project-main-20260504/clang/lib/AST/ExprConstant.cpp:6007:40
#14 0x0000582671923006 HandleFunctionCall(clang::SourceLocation, clang::FunctionDecl const*, (anonymous namespace)::LValue const*, clang::Expr const*, llvm::ArrayRef, (anonymous namespace)::CallRef, clang::Stmt const*, (anonymous namespace)::EvalInfo&, clang::APValue&, (anonymous namespace)::LValue const*) /tmp/llvm-project-main-20260504/clang/lib/AST/ExprConstant.cpp:7052:36
#15 0x000058267192a6ad (anonymous namespace)::ExprEvaluatorBase<(anonymous namespace)::IntExprEvaluator>::handleCallExpr(clang::CallExpr const*, clang::APValue&, (anonymous namespace)::LValue const*) (.constprop.0) /tmp/llvm-project-main-20260504/clang/lib/AST/ExprConstant.cpp:8867:66
#16 0x00005826718df829 VisitCallExpr /tmp/llvm-project-main-20260504/clang/lib/AST/ExprConstant.cpp:8662:24
#17 0x00005826718df829 (anonymous namespace)::IntExprEvaluator::VisitCallExpr(clang::CallExpr const*) /tmp/llvm-project-main-20260504/clang/lib/AST/ExprConstant.cpp:16252:46
#18 0x0000582671908841 Evaluate(clang::APValue&, (anonymous namespace)::EvalInfo&, clang::Expr const*) /tmp/llvm-project-main-20260504/clang/lib/AST/ExprConstant.cpp:21008:46
#19 0x0000582671922609 clang::Expr::EvaluateAsConstantExpr(clang::Expr::EvalResult&, clang::ASTContext const&, clang::Expr::ConstantExprKind) const /tmp/llvm-project-main-20260504/clang/lib/AST/ExprConstant.cpp:21415:29
#20 0x0000582671fc12a7 clang::Sema::EvaluateConvertedConstantExpression(clang::Expr*, clang::QualType, clang::APValue&, clang::CCEKind, bool, clang::APValue const&) /tmp/llvm-project-main-20260504/clang/lib/Sema/SemaOverload.cpp:6697:55
#21 0x0000582671fdad5d CheckConvertedConstantExpression(clang::Sema&, clang::Expr*, clang::QualType, clang::APValue&, clang::CCEKind, bool, clang::NamedDecl*) /tmp/llvm-project-main-20260504/clang/lib/Sema/SemaOverload.cpp:6644:47
#22 0x0000582671fdadef clang::Sema::CheckConvertedConstantExpression(clang::Expr*, clang::QualType, llvm::APSInt&, clang::CCEKind) /tmp/llvm-project-main-20260504/clang/lib/Sema/SemaOverload.cpp:6671:22
#23 0x0000582672013f5a clang::Sema::CheckTemplateArgument(clang::NamedDecl*, clang::QualType, clang::Expr*, clang::TemplateArgument&, clang::TemplateArgument&, bool, clang::Sema::CheckTemplateArgumentKind) /tmp/llvm-project-main-20260504/clang/lib/Sema/SemaTemplate.cpp:7472:7
#24 0x0000582672024821 operator() /tmp/llvm-project-main-20260504/clang/lib/Sema/SemaTemplate.cpp:5597:45
#25 0x0000582672024821 clang::Sema::CheckTemplateArgument(clang::NamedDecl*, clang::TemplateArgumentLoc&, clang::NamedDecl*, clang::SourceLocation, clang::SourceLocation, unsigned int, clang::Sema::CheckTemplateArgumentInfo&, clang::Sema::CheckTemplateArgumentKind) /tmp/llvm-project-main-20260504/clang/lib/Sema/SemaTemplate.cpp:5614:26
#26 0x0000582672026e10 clang::Sema::CheckTemplateArgumentList(clang::TemplateDecl*, clang::TemplateParameterList*, clang::SourceLocation, clang::TemplateArgumentListInfo&, clang::DefaultArguments const&, bool, clang::Sema::CheckTemplateArgumentInfo&, bool, bool*) /tmp/llvm-project-main-20260504/clang/lib/Sema/SemaTemplate.cpp:6002:9
#27 0x0000582672034d83 clang::Sema::CheckTemplateIdType(clang::ElaboratedTypeKeyword, clang::TemplateName, clang::SourceLocation, clang::TemplateArgumentListInfo&, clang::Scope*, bool) /tmp/llvm-project-main-20260504/clang/lib/Sema/SemaTemplate.cpp:3801:3
#28 0x0000582672371fe0 clang::Sema::ActOnCXXNestedNameSpecifier(clang::Scope*, clang::CXXScopeSpec&, clang::SourceLocation, clang::OpaquePtr, clang::SourceLocation, clang::SourceLocation, llvm::MutableArrayRef, clang::SourceLocation, clang::SourceLocation, bool) /tmp/llvm-project-main-20260504/clang/lib/Sema/SemaCXXScopeSpec.cpp:915:35
#29 0x00005826735636d7 clang::Parser::ParseOptionalCXXScopeSpecifier(clang::CXXScopeSpec&, clang::OpaquePtr, bool, bool, bool*, bool, clang::IdentifierInfo const**, bool, bool, bool, bool, bool) /tmp/llvm-project-main-20260504/clang/lib/Parse/ParseExprCXX.cpp:356:35
#30 0x00005826734db7b3 clang::Parser::TryAnnotateCXXScopeToken(bool) /tmp/llvm-project-main-20260504/clang/lib/Parse/Parser.cpp:2111:3
#31 0x000058267350ee30 clang::Parser::ParseDeclarationSpecifiers(clang::DeclSpec&, clang::Parser::ParsedTemplateInfo&, clang::AccessSpecifier, clang::Parser::DeclSpecContext, clang::LateParsedAttrList*, clang::ImplicitTypenameContext) /tmp/llvm-project-main-20260504/clang/lib/Parse/ParseDecl.cpp:3820:9
#32 0x00005826734dbf3e clang::Parser::ParseDeclOrFunctionDefInternal(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec&, clang::AccessSpecifier) /tmp/llvm-project-main-20260504/clang/lib/Parse/Parser.cpp:1067:26
#33 0x00005826734dca7f clang::Parser::ParseDeclarationOrFunctionDefinition(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*, clang::AccessSpecifier) /tmp/llvm-project-main-20260504/clang/lib/Parse/Parser.cpp:1175:42
#34 0x00005826734e3571 clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*) /tmp/llvm-project-main-20260504/clang/lib/Parse/Parser.cpp:1003:50
#35 0x00005826734e5237 clang::Parser::ParseTopLevelDecl(clang::OpaquePtr&, clang::Sema::ModuleImportState&) /tmp/llvm-project-main-20260504/clang/lib/Parse/Parser.cpp:711:36
#36 0x00005826734c9ada clang::ParseAST(clang::Sema&, bool, bool) /tmp/llvm-project-main-20260504/clang/lib/Parse/ParseAST.cpp:169:69
#37 0x00005826732c36e7 clang::FrontendAction::Execute() /tmp/llvm-project-main-20260504/clang/lib/Frontend/FrontendAction.cpp:1346:38
#38 0x0000582672ca807c llvm::Error::getPtr() const /tmp/llvm-project-main-20260504/llvm/include/llvm/Support/Error.h:278:51
#39 0x0000582672ca807c llvm::Error::operator bool() /tmp/llvm-project-main-20260504/llvm/include/llvm/Support/Error.h:241:22
#40 0x0000582672ca807c clang::clangd::ParsedAST::build(llvm::StringRef, clang::clangd::ParseInputs const&, std::unique_ptr>, llvm::ArrayRef, std::shared_ptr) /tmp/llvm-project-main-20260504/clang-tools-extra/clangd/ParsedAST.cpp:709:42
#41 0x0000582672a3fc37 std::_Optional_payload_base::_M_move_assign(std::_Optional_payload_base&&) /usr/include/c++/13/optional:193:2
#42 0x0000582672a3fc37 std::_Optional_payload::operator=(std::_Optional_payload&&) /usr/include/c++/13/optional:422:22
#43 0x0000582672a3fc37 std::_Optional_payload::operator=(std::_Optional_payload&&) /usr/include/c++/13/optional:438:26
#44 0x0000582672a3fc37 std::_Optional_base::operator=(std::_Optional_base&&) /usr/include/c++/13/optional:552:23
#45 0x0000582672a3fc37 std::optional::operator=(std::optional&&) /usr/include/c++/13/optional:707:11
#46 0x0000582672a3fc37 buildAST /tmp/llvm-project-main-20260504/clang-tools-extra/clangd/tool/Check.cpp:266:77
#47 0x0000582672a3fc37 clang::clangd::check(llvm::StringRef, clang::clangd::ThreadsafeFS const&, clang::clangd::ClangdLSPServer::Options const&) /tmp/llvm-project-main-20260504/clang-tools-extra/clangd/tool/Check.cpp:525:18
#48 0x0000582672a36bbb clang::clangd::clangdMain(int, char**) /tmp/llvm-project-main-20260504/clang-tools-extra/clangd/tool/ClangdMain.cpp:1039:16
#49 0x000074d257c2a1ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#50 0x000074d257c2a28b call_init ./csu/../csu/libc-start.c:128:20
#51 0x000074d257c2a28b __libc_start_main ./csu/../csu/libc-start.c:347:5
```

Contributor guide

Open the contributing guide

Research direction

Start by reproducing the assertion with the supplied C++ source and `clangd --check`. Read `clang/lib/AST/ExprConstant.cpp` around `EvaluateDependentExpr` and follow the stack through `SemaOverload.cpp` and `SemaTemplate.cpp`. Done means the reproducer no longer aborts and regression coverage protects the code-completion case.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
compilers, devtools
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.