Skip to content

Variable template lambda with constrained call operator converted to function pointer causes Assertion `!isValueDependent() && "Expression evaluator can't be called on a dependent expression."' #57971

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
davidstone opened this issue Sep 25, 2022 · 5 comments
Labels
clang:frontend Language frontend issues, e.g. anything involving "Sema" concepts C++20 concepts crash Prefer [crash-on-valid] or [crash-on-invalid] duplicate Resolved as duplicate

Comments

@davidstone
Copy link
Contributor

davidstone commented Sep 25, 2022

The following valid translation unit

template<typename>
concept any = true;

template<typename>
auto f = [](any auto) {
};

using function_ptr = void(*)(int);
function_ptr ptr = f<void>;

Causes clang to crash with an assertion failure

clang++: /root/llvm-project/clang/lib/AST/ExprConstant.cpp:15157: bool clang::Expr::EvaluateAsConstantExpr(clang::Expr::EvalResult&, const clang::ASTContext&, clang::Expr::ConstantExprKind) const: Assertion `!isValueDependent() && "Expression evaluator can't be called on a dependent expression."' 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: /opt/compiler-explorer/clang-assertions-trunk/bin/clang++ -gdwarf-4 -g -o /app/output.s -S --gcc-toolchain=/opt/compiler-explorer/gcc-snapshot -fcolor-diagnostics -fno-crash-diagnostics -std=c++2b <source>
1.	<source>:9:27: current parser token ';'
 #0 0x000055d9bc75cce4 PrintStackTraceSignalHandler(void*) Signals.cpp:0:0
 #1 0x000055d9bc75aa8c llvm::sys::CleanupOnSignal(unsigned long) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x3f6ea8c)
 #2 0x000055d9bc691a18 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x00007f58eaa18420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
 #4 0x00007f58ea4e500b raise (/lib/x86_64-linux-gnu/libc.so.6+0x4300b)
 #5 0x00007f58ea4c4859 abort (/lib/x86_64-linux-gnu/libc.so.6+0x22859)
 #6 0x00007f58ea4c4729 (/lib/x86_64-linux-gnu/libc.so.6+0x22729)
 #7 0x00007f58ea4d5fd6 (/lib/x86_64-linux-gnu/libc.so.6+0x33fd6)
 #8 0x000055d9bfd4fc4f (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x7563c4f)
 #9 0x000055d9bef69cc1 clang::ActionResult<clang::Expr*, true> calculateConstraintSatisfaction<calculateConstraintSatisfaction(clang::Sema&, clang::NamedDecl const*, clang::SourceLocation, clang::MultiLevelTemplateArgumentList const&, clang::Expr const*, clang::ConstraintSatisfaction&)::'lambda'(clang::Expr const*)>(clang::Sema&, clang::Expr const*, clang::ConstraintSatisfaction&, calculateConstraintSatisfaction(clang::Sema&, clang::NamedDecl const*, clang::SourceLocation, clang::MultiLevelTemplateArgumentList const&, clang::Expr const*, clang::ConstraintSatisfaction&)::'lambda'(clang::Expr const*)&&) SemaConcept.cpp:0:0
#10 0x000055d9bef6a362 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
#11 0x000055d9bef6a8ae clang::Sema::CheckConstraintSatisfaction(clang::NamedDecl const*, llvm::ArrayRef<clang::Expr const*>, llvm::SmallVectorImpl<clang::Expr*>&, clang::MultiLevelTemplateArgumentList const&, clang::SourceRange, clang::ConstraintSatisfaction&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x677e8ae)
#12 0x000055d9bef6aebb clang::Sema::CheckInstantiatedFunctionTemplateConstraints(clang::SourceLocation, clang::FunctionDecl*, llvm::ArrayRef<clang::TemplateArgument>, clang::ConstraintSatisfaction&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x677eebb)
#13 0x000055d9bf70c05f clang::Sema::FinishTemplateArgumentDeduction(clang::FunctionTemplateDecl*, llvm::SmallVectorImpl<clang::DeducedTemplateArgument>&, unsigned int, clang::FunctionDecl*&, clang::sema::TemplateDeductionInfo&, llvm::SmallVectorImpl<clang::Sema::OriginalCallArg> const*, bool, llvm::function_ref<bool ()>) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x6f2005f)
#14 0x000055d9bf70ccc2 void llvm::function_ref<void ()>::callback_fn<clang::Sema::DeduceTemplateArguments(clang::FunctionTemplateDecl*, clang::QualType, clang::CXXConversionDecl*&, clang::sema::TemplateDeductionInfo&)::'lambda'()>(long) SemaTemplateDeduction.cpp:0:0
#15 0x000055d9bee19be5 clang::Sema::runWithSufficientStackSpace(clang::SourceLocation, llvm::function_ref<void ()>) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x662dbe5)
#16 0x000055d9bf70177e clang::Sema::DeduceTemplateArguments(clang::FunctionTemplateDecl*, clang::QualType, clang::CXXConversionDecl*&, clang::sema::TemplateDeductionInfo&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x6f1577e)
#17 0x000055d9bf532c13 clang::Sema::AddTemplateConversionCandidate(clang::FunctionTemplateDecl*, clang::DeclAccessPair, clang::CXXRecordDecl*, clang::Expr*, clang::QualType, clang::OverloadCandidateSet&, bool, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x6d46c13)
#18 0x000055d9bf387fb0 TryUserDefinedConversion(clang::Sema&, clang::QualType, clang::InitializationKind const&, clang::Expr*, clang::InitializationSequence&, bool) SemaInit.cpp:0:0
#19 0x000055d9bf39acdf clang::InitializationSequence::InitializeFrom(clang::Sema&, clang::InitializedEntity const&, clang::InitializationKind const&, llvm::MutableArrayRef<clang::Expr*>, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x6baecdf)
#20 0x000055d9bf01e357 clang::Sema::AddInitializerToDecl(clang::Decl*, clang::Expr*, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x6832357)
#21 0x000055d9becfa0d6 clang::Parser::ParseDeclarationAfterDeclaratorAndAttributes(clang::Declarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::ForRangeInit*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x650e0d6)
#22 0x000055d9bed15880 clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::ParsedAttributes&, clang::SourceLocation*, clang::Parser::ForRangeInit*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x6529880)
#23 0x000055d9becd6bb9 clang::Parser::ParseDeclOrFunctionDefInternal(clang::ParsedAttributes&, clang::ParsingDeclSpec&, clang::AccessSpecifier) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x64eabb9)
#24 0x000055d9becd7410 clang::Parser::ParseDeclarationOrFunctionDefinition(clang::ParsedAttributes&, clang::ParsingDeclSpec*, clang::AccessSpecifier) (.part.0) Parser.cpp:0:0
#25 0x000055d9becdcbcb clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsingDeclSpec*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x64f0bcb)
#26 0x000055d9becdda5a clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x64f1a5a)
#27 0x000055d9becd1f0a clang::ParseAST(clang::Sema&, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x64e5f0a)
#28 0x000055d9bda76058 clang::CodeGenAction::ExecuteAction() (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x528a058)
#29 0x000055d9bd30fb99 clang::FrontendAction::Execute() (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x4b23b99)
#30 0x000055d9bd29735e clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x4aab35e)
#31 0x000055d9bd3f5143 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x4c09143)
#32 0x000055d9b9c10df4 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x1424df4)
#33 0x000055d9b9c09ed8 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&) driver.cpp:0:0
#34 0x000055d9bd1064a9 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::'lambda'()>(long) Job.cpp:0:0
#35 0x000055d9bc6921ba llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x3ea61ba)
#36 0x000055d9bd106cff clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (.part.0) Job.cpp:0:0
#37 0x000055d9bd0d0f69 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x48e4f69)
#38 0x000055d9bd0d19ed clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x48e59ed)
#39 0x000055d9bd0db48c clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x48ef48c)
#40 0x000055d9b9c0f1d3 clang_main(int, char**) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x14231d3)
#41 0x00007f58ea4c6083 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24083)
#42 0x000055d9b9c09ace _start (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x141dace)
clang-16: error: clang frontend command failed with exit code 134 (use -v to see invocation)
Compiler returned: 134

See it live: https://godbolt.org/z/8Tdsneahj

@EugeneZelenko EugeneZelenko added clang:frontend Language frontend issues, e.g. anything involving "Sema" crash Prefer [crash-on-valid] or [crash-on-invalid] and removed new issue labels Sep 25, 2022
@llvmbot
Copy link
Member

llvmbot commented Sep 25, 2022

@llvm/issue-subscribers-clang-frontend

@llvmbot
Copy link
Member

llvmbot commented Sep 25, 2022

@llvm/issue-subscribers-c-2b

@yuanfang-chen yuanfang-chen added concepts C++20 concepts and removed c++23 labels Sep 25, 2022
@yuanfang-chen
Copy link
Collaborator

@erichkeane might be related to deferred concept instantiation.

@erichkeane
Copy link
Collaborator

Yep, I suspect so. I think we have a couple of similar issues with instantiation of constraints on lambdas. I suspect there is 1 issue that all of these bugs are reproducing, but I have been on weekend and haven't had a chance to debug them yet to confirm.

@erichkeane
Copy link
Collaborator

I've confirmed for myself that this is a duplicate of #57958 . So I'm going to 'close as a duplicate'. I'll use the reproducer here as well for my testing, so thank you! The 2nd 1/2 of the bug report in #57945 is ALSO a duplicate, but I'm using that to track a slightly different issue.

The 'fact pattern' here is a generic lambda used in the initializer of a templated variable. It causes us to not properly set up the instantiation parameters. SO, closing as a duplicate.

@erichkeane erichkeane closed this as not planned Won't fix, can't repro, duplicate, stale Sep 26, 2022
@EugeneZelenko EugeneZelenko added the duplicate Resolved as duplicate label Sep 26, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
clang:frontend Language frontend issues, e.g. anything involving "Sema" concepts C++20 concepts crash Prefer [crash-on-valid] or [crash-on-invalid] duplicate Resolved as duplicate
Projects
Status: No status
Development

No branches or pull requests

5 participants