mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-18 19:16:43 +00:00
[Clang] Correctly determine constexprness of dependent lambdas. (#124468)
We skipped checking if a lambda is constexpr if the parent context was dependent, even if the lambda itself wasn't (and there is no other opportunity to establish constexprness) Fixes #114234 Fixes #97958
This commit is contained in:
parent
dec47b76f4
commit
e4514293f9
@ -991,6 +991,7 @@ Bug Fixes to C++ Support
|
||||
- Fixed assertions or false compiler diagnostics in the case of C++ modules for
|
||||
lambda functions or inline friend functions defined inside templates (#GH122493).
|
||||
- Clang now rejects declaring an alias template with the same name as its template parameter. (#GH123423)
|
||||
- Correctly determine the implicit constexprness of lambdas in dependent contexts. (#GH97958) (#GH114234)
|
||||
|
||||
Bug Fixes to AST Handling
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -2239,18 +2239,18 @@ ExprResult Sema::BuildLambdaExpr(SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
|
||||
Cleanup.mergeFrom(LambdaCleanup);
|
||||
|
||||
LambdaExpr *Lambda = LambdaExpr::Create(Context, Class, IntroducerRange,
|
||||
CaptureDefault, CaptureDefaultLoc,
|
||||
ExplicitParams, ExplicitResultType,
|
||||
CaptureInits, EndLoc,
|
||||
ContainsUnexpandedParameterPack);
|
||||
LambdaExpr *Lambda =
|
||||
LambdaExpr::Create(Context, Class, IntroducerRange, CaptureDefault,
|
||||
CaptureDefaultLoc, ExplicitParams, ExplicitResultType,
|
||||
CaptureInits, EndLoc, ContainsUnexpandedParameterPack);
|
||||
|
||||
// If the lambda expression's call operator is not explicitly marked constexpr
|
||||
// and we are not in a dependent context, analyze the call operator to infer
|
||||
// and is not dependent, analyze the call operator to infer
|
||||
// its constexpr-ness, suppressing diagnostics while doing so.
|
||||
if (getLangOpts().CPlusPlus17 && !CallOperator->isInvalidDecl() &&
|
||||
!CallOperator->isConstexpr() &&
|
||||
!isa<CoroutineBodyStmt>(CallOperator->getBody()) &&
|
||||
!Class->getDeclContext()->isDependentContext()) {
|
||||
!Class->isDependentContext()) {
|
||||
CallOperator->setConstexprKind(
|
||||
CheckConstexprFunctionDefinition(CallOperator,
|
||||
CheckConstexprKind::CheckValid)
|
||||
|
@ -349,3 +349,27 @@ static_assert(OtherCaptures(), "");
|
||||
} // namespace PR36054
|
||||
|
||||
#endif // ndef CPP14_AND_EARLIER
|
||||
|
||||
|
||||
#if __cpp_constexpr >= 201907L
|
||||
namespace GH114234 {
|
||||
template <auto Arg>
|
||||
auto g() { return Arg; }
|
||||
|
||||
template <typename>
|
||||
auto f() {
|
||||
[]<typename>() {
|
||||
g<[] { return 123; }()>();
|
||||
}.template operator()<int>();
|
||||
}
|
||||
|
||||
void test() { f<int>(); }
|
||||
}
|
||||
|
||||
namespace GH97958 {
|
||||
static_assert(
|
||||
[]<int I=0>() -> decltype([]{ return true; })
|
||||
{ return {}; }()());
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user