llvm-project icon indicating copy to clipboard operation
llvm-project copied to clipboard

Clang crash during parsing of lambda expession

Open AndreyG opened this issue 1 year ago • 2 comments

Repro:

int(*f)(int) = [](auto t) -> decltype([=] { return t; } ()) { return t; };

Stack dump:

Stack dump:
0.	Program arguments: /opt/compiler-explorer/clang-14.0.0/bin/clang++ -gdwarf-4 -g -o /app/output.s -mllvm --x86-asm-syntax=intel -S --gcc-toolchain=/opt/compiler-explorer/gcc-11.2.0 -fcolor-diagnostics -fno-crash-diagnostics <source>
1.	<source>:1:58: current parser token ')'
2.	<source>:1:16: lambda expression parsing
 #0 0x0000557230d7de8f PrintStackTraceSignalHandler(void*) Signals.cpp:0:0
 #1 0x0000557230d7bd60 llvm::sys::CleanupOnSignal(unsigned long) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x357bd60)
 #2 0x0000557230cb6b78 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x00007f3ad94bb3c0 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x143c0)
 #4 0x0000557233624f13 clang::ASTContext::getTypeInfoImpl(clang::Type const*) const (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x5e24f13)
 #5 0x00005572336182ed clang::ASTContext::getTypeInfo(clang::Type const*) const (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x5e182ed)
 #6 0x00005572336227fa clang::ASTContext::getTypeInfoInChars(clang::Type const*) const (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x5e227fa)
 #7 0x0000557233622974 clang::ASTContext::getTypeInfoInChars(clang::QualType) const (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x5e22974)
 #8 0x0000557233921b24 (anonymous namespace)::ItaniumRecordLayoutBuilder::LayoutField(clang::FieldDecl const*, bool)::'lambda'(bool)::operator()(bool) const RecordLayoutBuilder.cpp:0:0
 #9 0x000055723392f4a8 (anonymous namespace)::ItaniumRecordLayoutBuilder::LayoutField(clang::FieldDecl const*, bool) RecordLayoutBuilder.cpp:0:0
#10 0x0000557233930525 (anonymous namespace)::ItaniumRecordLayoutBuilder::LayoutFields(clang::RecordDecl const*) RecordLayoutBuilder.cpp:0:0
#11 0x000055723392cbff clang::ASTContext::getASTRecordLayout(clang::RecordDecl const*) const (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x612cbff)
#12 0x0000557233625362 clang::ASTContext::getTypeInfoImpl(clang::Type const*) const (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x5e25362)
#13 0x00005572336182ed clang::ASTContext::getTypeInfo(clang::Type const*) const (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x5e182ed)
#14 0x00005572336184f5 clang::ASTContext::getTypeAlignInChars(clang::QualType) const (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x5e184f5)
#15 0x0000557232d1a31c clang::Sema::CheckArgAlignment(clang::SourceLocation, clang::NamedDecl*, llvm::StringRef, clang::QualType, clang::QualType) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x551a31c)
#16 0x0000557232d549e9 clang::Sema::CheckFunctionCall(clang::FunctionDecl*, clang::CallExpr*, clang::FunctionProtoType const*) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x55549e9)
#17 0x000055723322d30f clang::Sema::BuildCallToObjectOfClassType(clang::Scope*, clang::Expr*, clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x5a2d30f)
#18 0x0000557232f921f4 clang::Sema::BuildCallExpr(clang::Scope*, clang::Expr*, clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation, clang::Expr*, bool, bool) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x57921f4)
#19 0x0000557232f96a84 clang::Sema::ActOnCallExpr(clang::Scope*, clang::Expr*, clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation, clang::Expr*) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x5796a84)
#20 0x0000557232bf45c8 clang::Parser::ParsePostfixExpressionSuffix(clang::ActionResult<clang::Expr*, true>) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x53f45c8)
#21 0x0000557232bee677 clang::Parser::ParseCastExpression(clang::Parser::CastParseKind, bool, bool&, clang::Parser::TypeCastState, bool, bool*) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x53ee677)
#22 0x0000557232bf1096 clang::Parser::ParseCastExpression(clang::Parser::CastParseKind, bool, clang::Parser::TypeCastState, bool, bool*) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x53f1096)
#23 0x0000557232bf1128 clang::Parser::ParseAssignmentExpression(clang::Parser::TypeCastState) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x53f1128)
#24 0x0000557232bf3569 clang::Parser::ParseExpression(clang::Parser::TypeCastState) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x53f3569)
#25 0x0000557232bd84ee clang::Parser::ParseDecltypeSpecifier(clang::DeclSpec&) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x53d84ee)
#26 0x0000557232c044a1 clang::Parser::ParseOptionalCXXScopeSpecifier(clang::CXXScopeSpec&, clang::OpaquePtr<clang::QualType>, bool, bool, bool*, bool, clang::IdentifierInfo**, bool, bool) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x54044a1)
#27 0x0000557232b9ee0c clang::Parser::TryAnnotateCXXScopeToken(bool) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x539ee0c)
#28 0x0000557232bcaf2f clang::Parser::ParseDeclarationSpecifiers(clang::DeclSpec&, clang::Parser::ParsedTemplateInfo const&, clang::AccessSpecifier, clang::Parser::DeclSpecContext, clang::Parser::LateParsedAttrList*) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x53caf2f)
#29 0x0000557232bccc91 clang::Parser::ParseSpecifierQualifierList(clang::DeclSpec&, clang::AccessSpecifier, clang::Parser::DeclSpecContext) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x53ccc91)
#30 0x0000557232bc0567 clang::Parser::ParseTypeName(clang::SourceRange*, clang::DeclaratorContext, clang::AccessSpecifier, clang::Decl**, clang::ParsedAttributes*) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x53c0567)
#31 0x0000557232c06b61 clang::Parser::ParseLambdaExpressionAfterIntroducer(clang::LambdaIntroducer&)::'lambda0'(clang::SourceLocation, clang::SourceLocation, llvm::MutableArrayRef<clang::DeclaratorChunk::ParamInfo>, clang::SourceLocation)::operator()(clang::SourceLocation, clang::SourceLocation, llvm::MutableArrayRef<clang::DeclaratorChunk::ParamInfo>, clang::SourceLocation) const ParseExprCXX.cpp:0:0
#32 0x0000557232c07b29 clang::Parser::ParseLambdaExpressionAfterIntroducer(clang::LambdaIntroducer&) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x5407b29)
#33 0x0000557232c07ea3 clang::Parser::ParseLambdaExpression() (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x5407ea3)
#34 0x0000557232befc52 clang::Parser::ParseCastExpression(clang::Parser::CastParseKind, bool, bool&, clang::Parser::TypeCastState, bool, bool*) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x53efc52)
#35 0x0000557232bf1096 clang::Parser::ParseCastExpression(clang::Parser::CastParseKind, bool, clang::Parser::TypeCastState, bool, bool*) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x53f1096)
#36 0x0000557232bf1128 clang::Parser::ParseAssignmentExpression(clang::Parser::TypeCastState) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x53f1128)
#37 0x0000557232bbcad0 clang::Parser::ParseDeclarationAfterDeclaratorAndAttributes(clang::Declarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::ForRangeInit*) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x53bcad0)
#38 0x0000557232bcd875 clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::SourceLocation*, clang::Parser::ForRangeInit*) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x53cd875)
#39 0x0000557232b9f5b9 clang::Parser::ParseDeclOrFunctionDefInternal(clang::ParsedAttributesWithRange&, clang::ParsingDeclSpec&, clang::AccessSpecifier) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x539f5b9)
#40 0x0000557232b9fcc1 clang::Parser::ParseDeclarationOrFunctionDefinition(clang::ParsedAttributesWithRange&, clang::ParsingDeclSpec*, clang::AccessSpecifier) (.part.280) Parser.cpp:0:0
#41 0x0000557232ba5be9 clang::Parser::ParseExternalDeclaration(clang::ParsedAttributesWithRange&, clang::ParsingDeclSpec*) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x53a5be9)
#42 0x0000557232ba7009 clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, bool) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x53a7009)
#43 0x0000557232ba7505 clang::Parser::ParseFirstTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x53a7505)
#44 0x0000557232b9a833 clang::ParseAST(clang::Sema&, bool, bool) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x539a833)
#45 0x0000557231d05b02 clang::CodeGenAction::ExecuteAction() (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x4505b02)
#46 0x0000557231701161 clang::FrontendAction::Execute() (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x3f01161)
#47 0x000055723169c2f2 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x3e9c2f2)
#48 0x00005572317cc853 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x3fcc853)
#49 0x000055722e99b1d4 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x119b1d4)
#50 0x000055722e99718d ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&) driver.cpp:0:0
#51 0x00005572315375f5 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
#52 0x0000557230cb7163 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x34b7163)
#53 0x00005572315396c8 clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, bool*) const (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x3d396c8)
#54 0x000055723150cb1a clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&) const (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x3d0cb1a)
#55 0x000055723150d65f clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*> >&) const (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x3d0d65f)
#56 0x0000557231516005 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*> >&) (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x3d16005)
#57 0x000055722e8a80b2 main (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x10a80b2)
#58 0x00007f3ad8f690b3 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x240b3)
#59 0x000055722e996d0a _start (/opt/compiler-explorer/clang-14.0.0/bin/clang+++0x1196d0a)

Godbolt reference

AndreyG avatar Aug 15 '22 13:08 AndreyG

@llvm/issue-subscribers-clang-frontend

llvmbot avatar Aug 15 '22 14:08 llvmbot

Testing with clang trunk we can see the assert is:

clang++: tools/clang/include/clang/AST/TypeNodes.inc:73: clang::TypeInfo clang::ASTContext::getTypeInfoImpl(const clang::Type*) const: Assertion `!T->isDependentType() && "should not see dependent types here"' failed.

gobolt: https://gcc.godbolt.org/z/PMEbcEaWz

It looks like there are several bugs with a similar assert but the code varies a bit from each one e.g.: https://github.com/llvm/llvm-project/issues/45822

shafik avatar Aug 15 '22 14:08 shafik

Fixed in 18 https://gcc.godbolt.org/z/M9PoqGohY

cor3ntin avatar Jan 20 '24 16:01 cor3ntin