LLVM Bugzilla is read-only and represents the historical archive of all LLVM issues filled before November 26, 2021. Use github to submit LLVM bugs

Bug 42851 - Segfault when evaluating generic lambda with lambda default parameter
Summary: Segfault when evaluating generic lambda with lambda default parameter
Status: CONFIRMED
Alias: None
Product: clang
Classification: Unclassified
Component: C++14 (show other bugs)
Version: trunk
Hardware: PC All
: P enhancement
Assignee: Unassigned Clang Bugs
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2019-07-31 13:08 PDT by Louis Dionne
Modified: 2021-03-02 13:46 PST (History)
5 users (show)

See Also:
Fixed By Commit(s):


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Louis Dionne 2019-07-31 13:08:18 PDT
The following code causes Clang to assert (when built with assertions enabled, obviously):

    $ cat <<EOF | clang++ -xc++ - -std=c++14 -fsyntax-only
    int main() {
      auto apply = [](auto, void(*)() = []{}) { };
      apply(1);
    }
    EOF

Produces this output:

    Assertion failed: (isDependentContext() && "cannot iterate dependent diagnostics of non-dependent context"), function ddiags, file <snip>/clang-tot/clang/include/clang/AST/DependentDiagnostic.h, line 177.
    Stack dump:
    0.  Program arguments: <snip>/clang-tot/install/bin/clang-10 -cc1 -triple x86_64-apple-macosx10.15.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -fsyntax-only -disable-free -main-file-name - -mrelocation-model pic -pic-level 2 -mthread-model posix -mframe-pointer=all -masm-verbose -munwind-tables -target-cpu penryn -dwarf-column-info -debugger-tuning=lldb -ggnu-pubnames -target-linker-version 512.4 -resource-dir <snip>/clang-tot/install/lib/clang/10.0.0 -stdlib=libc++ -internal-isystem <snip>/clang-tot/install/bin/../include/c++/v1 -internal-isystem /usr/include/c++/v1 -internal-isystem /usr/local/include -internal-isystem <snip>/clang-tot/install/lib/clang/10.0.0/include -internal-externc-isystem /usr/include -std=c++14 -fdeprecated-macro -fdebug-compilation-dir <snip> -ferror-limit 19 -fmessage-length 211 -stack-protector 1 -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fobjc-runtime=macosx-10.15.0 -fcxx-exceptions -fexceptions -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -x c++ -
    1.  <stdin>:3:10: current parser token ')'
    2.  <stdin>:1:12: parsing function body 'main'
    3.  <stdin>:1:12: in compound statement ('{}')
    0  clang-10                 0x0000000105d8c775 llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 37
    1  clang-10                 0x0000000105d8b905 llvm::sys::RunSignalHandlers() + 85
    2  clang-10                 0x0000000105d8cd68 SignalHandler(int) + 264
    3  libsystem_platform.dylib 0x00007fff6d809b1d _sigtramp + 29
    4  libsystem_platform.dylib 0x0000000000000e60 _sigtramp + 18446603338679022432
    5  libsystem_c.dylib        0x00007fff6d6df91c abort + 120
    6  libsystem_c.dylib        0x00007fff6d6debd6 err + 0
    7  clang-10                 0x0000000108eef413 clang::Sema::PerformDependentDiagnostics(clang::DeclContext const*, clang::MultiLevelTemplateArgumentList const&) (.cold.1) + 35
    8  clang-10                 0x000000010779dcb6 clang::Sema::PerformDependentDiagnostics(clang::DeclContext const*, clang::MultiLevelTemplateArgumentList const&) + 102
    9  clang-10                 0x0000000107778c18 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformLambdaExpr(clang::LambdaExpr*) + 4280
    10 clang-10                 0x0000000107763255 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformExpr(clang::Expr*) + 2309
    11 clang-10                 0x000000010775c934 clang::Sema::SubstParmVarDecl(clang::ParmVarDecl*, clang::MultiLevelTemplateArgumentList const&, int, llvm::Optional<unsigned int>, bool) + 1236
    12 clang-10                 0x000000010775d74d clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformFunctionTypeParams(clang::SourceLocation, llvm::ArrayRef<clang::ParmVarDecl*>, clang::QualType const*, clang::FunctionType::ExtParameterInfo const*, llvm::SmallVectorImpl<clang::QualType>&, llvm::SmallVectorImpl<clang::ParmVarDecl*>*, clang::Sema::ExtParameterInfoBuilder&) + 1533
    13 clang-10                 0x000000010775b739 clang::Sema::SubstFunctionDeclType(clang::TypeSourceInfo*, clang::MultiLevelTemplateArgumentList const&, clang::SourceLocation, clang::DeclarationName, clang::CXXRecordDecl*, clang::Qualifiers) + 1977
    14 clang-10                 0x0000000107795e9e clang::TemplateDeclInstantiator::SubstFunctionType(clang::FunctionDecl*, llvm::SmallVectorImpl<clang::ParmVarDecl*>&) + 254
    15 clang-10                 0x0000000107793642 clang::TemplateDeclInstantiator::VisitCXXMethodDecl(clang::CXXMethodDecl*, clang::TemplateParameterList*, llvm::Optional<clang::ASTTemplateArgumentListInfo const*>) + 674
    16 clang-10                 0x000000010779b576 clang::Sema::SubstDecl(clang::Decl*, clang::DeclContext*, clang::MultiLevelTemplateArgumentList const&) + 150
    17 clang-10                 0x000000010771c38c 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 ()>) + 2636
    18 clang-10                 0x000000010771db50 clang::Sema::DeduceTemplateArguments(clang::FunctionTemplateDecl*, clang::TemplateArgumentListInfo*, llvm::ArrayRef<clang::Expr*>, clang::FunctionDecl*&, clang::sema::TemplateDeductionInfo&, bool, llvm::function_ref<bool (llvm::ArrayRef<clang::QualType>)>) + 2320
    19 clang-10                 0x000000010761a669 clang::Sema::AddMethodTemplateCandidate(clang::FunctionTemplateDecl*, clang::DeclAccessPair, clang::CXXRecordDecl*, clang::TemplateArgumentListInfo*, clang::QualType, clang::Expr::Classification, llvm::ArrayRef<clang::Expr*>, clang::OverloadCandidateSet&, bool, bool) + 489
    20 clang-10                 0x000000010761adc7 clang::Sema::AddMethodCandidate(clang::DeclAccessPair, clang::QualType, clang::Expr::Classification, llvm::ArrayRef<clang::Expr*>, clang::OverloadCandidateSet&, bool) + 215
    21 clang-10                 0x000000010763371b clang::Sema::BuildCallToObjectOfClassType(clang::Scope*, clang::Expr*, clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation) + 1003
    22 clang-10                 0x0000000107401ca7 clang::Sema::BuildCallExpr(clang::Scope*, clang::Expr*, clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation, clang::Expr*, bool) + 1959
    23 clang-10                 0x0000000107419349 clang::Sema::ActOnCallExpr(clang::Scope*, clang::Expr*, clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation, clang::Expr*) + 41
    24 clang-10                 0x000000010709b489 clang::Parser::ParsePostfixExpressionSuffix(clang::ActionResult<clang::Expr*, true>) + 3897
    25 clang-10                 0x00000001070a0938 clang::Parser::ParseCastExpression(bool, bool, bool&, clang::Parser::TypeCastState, bool) + 18472
    26 clang-10                 0x0000000107098c26 clang::Parser::ParseAssignmentExpression(clang::Parser::TypeCastState) + 166
    27 clang-10                 0x0000000107098b5e clang::Parser::ParseExpression(clang::Parser::TypeCastState) + 14
    28 clang-10                 0x00000001070e745b clang::Parser::ParseExprStatement(clang::Parser::ParsedStmtContext) + 75
    29 clang-10                 0x00000001070e59af clang::Parser::ParseStatementOrDeclarationAfterAttributes(llvm::SmallVector<clang::Stmt*, 32u>&, clang::Parser::ParsedStmtContext, clang::SourceLocation*, clang::Parser::ParsedAttributesWithRange&) + 943
    30 clang-10                 0x00000001070e547c clang::Parser::ParseStatementOrDeclaration(llvm::SmallVector<clang::Stmt*, 32u>&, clang::Parser::ParsedStmtContext, clang::SourceLocation*) + 188
    31 clang-10                 0x00000001070ed54d clang::Parser::ParseCompoundStatementBody(bool) + 1725
    32 clang-10                 0x00000001070ee0d4 clang::Parser::ParseFunctionStatementBody(clang::Decl*, clang::Parser::ParseScope&) + 180
    33 clang-10                 0x0000000107107373 clang::Parser::ParseFunctionDefinition(clang::ParsingDeclarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::LateParsedAttrList*) + 1971
    34 clang-10                 0x000000010706fcb5 clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::SourceLocation*, clang::Parser::ForRangeInit*) + 2053
    35 clang-10                 0x0000000107106885 clang::Parser::ParseDeclOrFunctionDefInternal(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec&, clang::AccessSpecifier) + 693
    36 clang-10                 0x00000001071062c3 clang::Parser::ParseDeclarationOrFunctionDefinition(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*, clang::AccessSpecifier) + 371
    37 clang-10                 0x0000000107104d30 clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*) + 2704
    38 clang-10                 0x0000000107102f96 clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, bool) + 1126
    39 clang-10                 0x0000000107102a2a clang::Parser::ParseFirstTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&) + 42
    40 clang-10                 0x000000010705bf5c clang::ParseAST(clang::Sema&, bool, bool) + 444
    41 clang-10                 0x00000001064291f4 clang::FrontendAction::Execute() + 84
    42 clang-10                 0x00000001063dc358 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 1528
    43 clang-10                 0x000000010649a313 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 1811
    44 clang-10                 0x0000000104239ff7 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) + 2375
    45 clang-10                 0x0000000104237856 main + 10662
    46 libdyld.dylib            0x00007fff6d6097a9 start + 1
    47 libdyld.dylib            0x000000000000003d start + 18446603338681116821
    clang-10: error: unable to execute command: Abort trap: 6
    clang-10: error: clang frontend command failed due to signal (use -v to see invocation)
    clang version 10.0.0 (<snip> c940adeddb86dfccfcbb2eb3fedd0deb0b3640e1)
    Target: x86_64-apple-darwin19.0.0
    Thread model: posix
    InstalledDir: <snip>/clang-tot/install/bin
    clang-10: note: diagnostic msg: PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace, preprocessed source, and associated run script.
    clang-10: note: diagnostic msg: Error generating preprocessed source(s) - ignoring input from stdin.
    clang-10: note: diagnostic msg: Error generating preprocessed source(s) - no preprocessable inputs.
Comment 1 Louis Dionne 2019-07-31 13:10:28 PDT
I'm creating this for tracking purposes -- I'm about to submit a review for the fix.
Comment 2 Roland Schulz 2019-08-12 10:31:49 PDT
https://bugs.llvm.org/show_bug.cgi?id=41922 seems very similar. Might be possible to fix both together.
Comment 3 Louis Dionne 2019-08-12 11:28:51 PDT
I don't understand the root cause for PR41922, but I don't think they are related. PR41922 appears to be an issue in the code gen, while this issue is in the frontend.
Comment 4 Louis Dionne 2021-03-02 13:46:34 PST
We still segfault on this (the same reproducer I originally filed):

$ cat <<EOF | clang++ -xc++ - -std=c++14 -fsyntax-only
int main() {
  auto apply = [](auto, void(*)() = []{}) { };
  apply(1);
}
EOF

I'm returning this bug report to Clang Unassigned since I don't have time to work on this with the libc++ workload.