Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -331,6 +331,8 @@ `Issue 58800 `_ - Fix an issue that triggers a crash if we instantiate a hidden friend functions. This fixes `Issue 54457 `_ +- Fix an issue that makes Clang crash on lambda template parameters. This fixes + `Issue 57960 `_ Improvements to Clang's diagnostics ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Index: clang/include/clang/Sema/Sema.h =================================================================== --- clang/include/clang/Sema/Sema.h +++ clang/include/clang/Sema/Sema.h @@ -9624,6 +9624,12 @@ return ExprEvalContexts.back().isUnevaluated(); } + bool isConstantEvaluatedContext() const { + assert(!ExprEvalContexts.empty() && + "Must be in an expression evaluation context"); + return ExprEvalContexts.back().isConstantEvaluated(); + } + bool isImmediateFunctionContext() const { assert(!ExprEvalContexts.empty() && "Must be in an expression evaluation context"); Index: clang/lib/Sema/TreeTransform.h =================================================================== --- clang/lib/Sema/TreeTransform.h +++ clang/lib/Sema/TreeTransform.h @@ -13234,10 +13234,11 @@ // context that isn't a DeclContext (such as a variable template), or when // substituting an unevaluated lambda inside of a function's parameter's type // - as parameter types are not instantiated from within a function's DC. We - // use isUnevaluatedContext() to distinguish the function parameter case. + // use evaluation contexts to distinguish the function parameter case. CXXRecordDecl::LambdaDependencyKind DependencyKind = CXXRecordDecl::LDK_Unknown; - if (getSema().isUnevaluatedContext() && + if ((getSema().isUnevaluatedContext() || + getSema().isConstantEvaluatedContext()) && (getSema().CurContext->isFileContext() || !getSema().CurContext->getParent()->isDependentContext())) DependencyKind = CXXRecordDecl::LDK_NeverDependent; Index: clang/test/CodeGenCXX/cxx20-unevaluated-lambda-crash.cpp =================================================================== --- /dev/null +++ clang/test/CodeGenCXX/cxx20-unevaluated-lambda-crash.cpp @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 %s -emit-llvm -o - | FileCheck %s + +// CHECK-LABEL: define linkonce_odr void @"_ZN10Issue579601EIiEENS_1FILNS_3$_0EEEEv"() +namespace Issue57960 { +template +class F {}; + +template +F<[]{}> E() { + return {}; +} + +static auto f = E(); +} Index: clang/test/SemaCXX/lambda-unevaluated.cpp =================================================================== --- clang/test/SemaCXX/lambda-unevaluated.cpp +++ clang/test/SemaCXX/lambda-unevaluated.cpp @@ -61,9 +61,7 @@ // Same. template void g(const char (*)[([]{ return N; })()]) {} // expected-note {{candidate}} template void g(const char (*)[([]{ return N; })()]) {} // expected-note {{candidate}} -// FIXME: We instantiate the lambdas into the context of the function template, -// so we think they're dependent and can't evaluate a call to them. -void use_g() { g<6>(&"hello"); } // expected-error {{no matching function}} +void use_g() { g<6>(&"hello"); } // expected-error {{ambiguous}} } namespace GH51416 {