Skip to content

ICE in llvm::Type::isIntegerTy(unsigned int) const #60432

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

Open
ecatmur opened this issue Jan 31, 2023 · 5 comments
Open

ICE in llvm::Type::isIntegerTy(unsigned int) const #60432

ecatmur opened this issue Jan 31, 2023 · 5 comments
Labels
c++20 clang:codegen IR generation bugs: mangling, exceptions, etc. confirmed Verified by a second party crash Prefer [crash-on-valid] or [crash-on-invalid]

Comments

@ecatmur
Copy link

ecatmur commented Jan 31, 2023

Split from #60431

The following program ICEs in Clang 16.0.0rc1:

template<auto F> constexpr auto x = F();
template<class> constexpr int a() { return 1; }
int f(auto) {
    return []<class T>(T) {
        return x<[] constexpr { return a<T>(); }>;
    }(2);
}
int i = f(3);
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-trunk/bin/clang++ -gdwarf-4 -g -o /app/output.s -mllvm --x86-asm-syntax=intel -S --gcc-toolchain=/opt/compiler-explorer/gcc-snapshot -fcolor-diagnostics -fno-crash-diagnostics -std=c++2b -O3 -stdlib=libc++ <source>
1.	<eof> parser at end of file
2.	<source>:3:5: instantiating function definition 'f<int>'
3.	<source>:1:33: Generating code for declaration 'x'
 #0 0x000055a0373b5a6f llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x3bb4a6f)
 #1 0x000055a0373b3a9c llvm::sys::CleanupOnSignal(unsigned long) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x3bb2a9c)
 #2 0x000055a037306828 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x00007fa41f8b9420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
 #4 0x000055a036c7a0c6 llvm::Type::isIntegerTy(unsigned int) const (/opt/compiler-explorer/clang-trunk/bin/clang+++0x34790c6)
 #5 0x000055a037941d1d clang::CodeGen::CodeGenTypes::ConvertTypeForMem(clang::QualType, bool) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x4140d1d)
 #6 0x000055a03781411d clang::CodeGen::CodeGenModule::EmitNullConstant(clang::QualType) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x401311d)
 #7 0x000055a0378d9dc9 clang::CodeGen::CodeGenModule::EmitGlobalVarDefinition(clang::VarDecl const*, bool) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x40d8dc9)
 #8 0x000055a0378fdf2d clang::CodeGen::CodeGenModule::EmitGlobalDefinition(clang::GlobalDecl, llvm::GlobalValue*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x40fcf2d)
 #9 0x000055a0378fe4c3 clang::CodeGen::CodeGenModule::EmitGlobal(clang::GlobalDecl) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x40fd4c3)
#10 0x000055a037905f13 clang::CodeGen::CodeGenModule::EmitTopLevelDecl(clang::Decl*) (.part.0) CodeGenModule.cpp:0:0
#11 0x000055a03a43fa40 clang::Sema::InstantiateVariableDefinition(clang::SourceLocation, clang::VarDecl*, bool, bool, bool) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x6c3ea40)
#12 0x000055a039a30fd5 clang::Sema::runWithSufficientStackSpace(clang::SourceLocation, llvm::function_ref<void ()>) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x622ffd5)
#13 0x000055a039e15c63 DoMarkVarDeclReferenced(clang::Sema&, clang::SourceLocation, clang::VarDecl*, clang::Expr*, llvm::DenseMap<clang::VarDecl const*, int, llvm::DenseMapInfo<clang::VarDecl const*, void>, llvm::detail::DenseMapPair<clang::VarDecl const*, int>>&) SemaExpr.cpp:0:0
#14 0x000055a039e16484 MarkExprReferenced(clang::Sema&, clang::SourceLocation, clang::Decl*, clang::Expr*, bool, llvm::DenseMap<clang::VarDecl const*, int, llvm::DenseMapInfo<clang::VarDecl const*, void>, llvm::detail::DenseMapPair<clang::VarDecl const*, int>>&) SemaExpr.cpp:0:0
#15 0x000055a039e185e0 clang::Sema::BuildDeclRefExpr(clang::ValueDecl*, clang::QualType, clang::ExprValueKind, clang::DeclarationNameInfo const&, clang::NestedNameSpecifierLoc, clang::NamedDecl*, clang::SourceLocation, clang::TemplateArgumentListInfo const*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x66175e0)
#16 0x000055a039e1927c clang::Sema::BuildDeclarationNameExpr(clang::CXXScopeSpec const&, clang::DeclarationNameInfo const&, clang::NamedDecl*, clang::NamedDecl*, clang::TemplateArgumentListInfo const*, bool) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x661827c)
#17 0x000055a03a294643 clang::Sema::BuildTemplateIdExpr(clang::CXXScopeSpec const&, clang::SourceLocation, clang::LookupResult&, bool, clang::TemplateArgumentListInfo const*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x6a93643)
#18 0x000055a03a3e00af clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformUnresolvedLookupExpr(clang::UnresolvedLookupExpr*) SemaTemplateInstantiate.cpp:0:0
#19 0x000055a03a3c19a3 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformExpr(clang::Expr*) SemaTemplateInstantiate.cpp:0:0
#20 0x000055a03a3c2c45 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformInitializer(clang::Expr*, bool) SemaTemplateInstantiate.cpp:0:0
#21 0x000055a03a3c44f7 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformReturnStmt(clang::ReturnStmt*) SemaTemplateInstantiate.cpp:0:0
#22 0x000055a03a3f4493 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformCompoundStmt(clang::CompoundStmt*, bool) SemaTemplateInstantiate.cpp:0:0
#23 0x000055a03a3c0df7 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformLambdaExpr(clang::LambdaExpr*) SemaTemplateInstantiate.cpp:0:0
#24 0x000055a03a3c1b62 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformExpr(clang::Expr*) SemaTemplateInstantiate.cpp:0:0
#25 0x000055a03a3caf4d clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformCallExpr(clang::CallExpr*) SemaTemplateInstantiate.cpp:0:0
#26 0x000055a03a3c2002 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformExpr(clang::Expr*) SemaTemplateInstantiate.cpp:0:0
#27 0x000055a03a3c2c45 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformInitializer(clang::Expr*, bool) SemaTemplateInstantiate.cpp:0:0
#28 0x000055a03a3c44f7 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformReturnStmt(clang::ReturnStmt*) SemaTemplateInstantiate.cpp:0:0
#29 0x000055a03a3f4493 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformCompoundStmt(clang::CompoundStmt*, bool) SemaTemplateInstantiate.cpp:0:0
#30 0x000055a03a3f92b5 clang::Sema::SubstStmt(clang::Stmt*, clang::MultiLevelTemplateArgumentList const&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x6bf82b5)
#31 0x000055a03a442217 clang::Sema::InstantiateFunctionDefinition(clang::SourceLocation, clang::FunctionDecl*, bool, bool, bool) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x6c41217)
#32 0x000055a03a44010f clang::Sema::PerformPendingInstantiations(bool) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x6c3f10f)
#33 0x000055a039a50fc7 clang::Sema::ActOnEndOfTranslationUnitFragment(clang::Sema::TUFragmentKind) (.part.0) Sema.cpp:0:0
#34 0x000055a039a515ed clang::Sema::ActOnEndOfTranslationUnit() (/opt/compiler-explorer/clang-trunk/bin/clang+++0x62505ed)
#35 0x000055a0398e9a6d clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x60e8a6d)
#36 0x000055a0398d8baa clang::ParseAST(clang::Sema&, bool, bool) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x60d7baa)
#37 0x000055a0386aa245 clang::CodeGenAction::ExecuteAction() (/opt/compiler-explorer/clang-trunk/bin/clang+++0x4ea9245)
#38 0x000055a037f84a11 clang::FrontendAction::Execute() (/opt/compiler-explorer/clang-trunk/bin/clang+++0x4783a11)
#39 0x000055a037f08e53 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x4707e53)
#40 0x000055a038068f0b clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x4867f0b)
#41 0x000055a034b8589c cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x138489c)
#42 0x000055a034b8105c ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&) driver.cpp:0:0
#43 0x000055a037d69cf9 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::'lambda'()>(long) Job.cpp:0:0
#44 0x000055a037306c87 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x3b05c87)
#45 0x000055a037d69f2c clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (.part.0) Job.cpp:0:0
#46 0x000055a037d3240c clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/opt/compiler-explorer/clang-trunk/bin/clang+++0x453140c)
#47 0x000055a037d32dfd clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/opt/compiler-explorer/clang-trunk/bin/clang+++0x4531dfd)
#48 0x000055a037d3d24c clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x453c24c)
#49 0x000055a034b839a3 clang_main(int, char**) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x13829a3)
#50 0x00007fa41f367083 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24083)
#51 0x000055a034b7d19e _start (/opt/compiler-explorer/clang-trunk/bin/clang+++0x137c19e)
clang-17: error: clang frontend command failed with exit code 139 (use -v to see invocation)
Compiler returned: 139
@shafik
Copy link
Collaborator

shafik commented Jan 31, 2023

Confirmed, godbolt: https://godbolt.org/z/x5Y8cGPPG

Assertion:

clang++: /root/llvm-project/clang/lib/AST/Decl.cpp:2493:
clang::APValue* clang::VarDecl::evaluateValueImpl(llvm::SmallVectorImpl<std::pair<clang::SourceLocation, clang::PartialDiagnostic> >&, bool) const:
Assertion `!Init->isValueDependent()' failed.

@shafik shafik added c++20 confirmed Verified by a second party labels Jan 31, 2023
@llvmbot
Copy link
Member

llvmbot commented Jan 31, 2023

@llvm/issue-subscribers-c-20

@EugeneZelenko EugeneZelenko added clang:codegen IR generation bugs: mangling, exceptions, etc. crash Prefer [crash-on-valid] or [crash-on-invalid] and removed new issue labels Jan 31, 2023
@llvmbot
Copy link
Member

llvmbot commented Jan 31, 2023

@llvm/issue-subscribers-clang-codegen

@tbaederr
Copy link
Contributor

tbaederr commented Feb 1, 2023

The expression that can't be evaluated is:

VarTemplateSpecializationDecl 0x621000097508 <./test.cpp:13:18, col:39> col:33 referenced x 'const auto' constexpr cinit
|-TemplateArgument decl
| `-TemplateParamObject 0x621000095b68 '' 'const (lambda at ./test.cpp:17:18)':'const (lambda at ./test.cpp:17:18)'
`-CXXOperatorCallExpr 0x621000097710 <col:37, col:39> 'auto' '()'
  |-ImplicitCastExpr 0x6210000976c0 <col:37, col:39> 'auto (*)() const' <FunctionToPointerDecay>
  | `-DeclRefExpr 0x621000097668 <col:37, col:39> 'auto () const' lvalue CXXMethod 0x621000095190 'operator()' 'auto () const'
  `-SubstNonTypeTemplateParmExpr 0x621000097638 <col:37> 'const (lambda at ./test.cpp:17:18)':'const (lambda at ./test.cpp:17:18)' lvalue
    |-NonTypeTemplateParmDecl 0x62100006f8c8 <col:10, col:15> col:15 referenced 'auto' depth 0 index 0 F
    `-DeclRefExpr 0x621000097610 <col:37> 'const (lambda at ./test.cpp:17:18)':'const (lambda at ./test.cpp:17:18)' lvalue TemplateParamObject 0x621000095b68 '' 'const (lambda at ./test.cpp:17:18)':'const (lambda at ./test.cpp:17:18)'

Should we even be trying to emit code for this?

@gavrilikhin-d
Copy link

gavrilikhin-d commented Oct 21, 2023

I've faced this issue while running the following IR with MCJIT:

%Struct = type { i1 }

define %Struct @execute() {
  %1 = alloca %Struct, align 8
  %Struct.x = getelementptr inbounds %Struct, ptr %1, i32 0, i32 0
  store i1 true, ptr %Struct.x, align 1
  %2 = load %Struct, ptr %1, align 1
  ret %Struct %2
}

image

This IR can be compiled to executable by clang 17.0 and it runs without errors

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
c++20 clang:codegen IR generation bugs: mangling, exceptions, etc. confirmed Verified by a second party crash Prefer [crash-on-valid] or [crash-on-invalid]
Projects
None yet
Development

No branches or pull requests

6 participants