Skip to content

Commit baf6bd3

Browse files
authored
[Clang] Fixes to immediate-escalating functions (#82281)
* Consider that immediate escalating function can appear at global scope, fixing a crash * Lambda conversion to function pointer was sometimes not performed in an immediate function context when it should be. Fixes #82258
1 parent db9811c commit baf6bd3

File tree

4 files changed

+35
-3
lines changed

4 files changed

+35
-3
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,10 @@ Bug Fixes to C++ Support
297297
was only accepted at namespace scope but not at local function scope.
298298
- Clang no longer tries to call consteval constructors at runtime when they appear in a member initializer.
299299
(`#782154 <https://github.com/llvm/llvm-project/issues/82154>`_`)
300+
- Fix crash when using an immediate-escalated function at global scope.
301+
(`#82258 <https://github.com/llvm/llvm-project/issues/82258>`_)
302+
- Correctly immediate-escalate lambda conversion functions.
303+
(`#82258 <https://github.com/llvm/llvm-project/issues/82258>`_)
300304

301305
Bug Fixes to AST Handling
302306
^^^^^^^^^^^^^^^^^^^^^^^^^

clang/include/clang/Sema/Sema.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1158,7 +1158,9 @@ class Sema final {
11581158
if (FD) {
11591159
FD->setWillHaveBody(true);
11601160
S.ExprEvalContexts.back().InImmediateFunctionContext =
1161-
FD->isImmediateFunction();
1161+
FD->isImmediateFunction() ||
1162+
S.ExprEvalContexts[S.ExprEvalContexts.size() - 2]
1163+
.isConstantEvaluated();
11621164
S.ExprEvalContexts.back().InImmediateEscalatingFunctionContext =
11631165
S.getLangOpts().CPlusPlus20 && FD->isImmediateEscalating();
11641166
} else

clang/lib/Sema/SemaExpr.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18311,7 +18311,6 @@ void Sema::CheckUnusedVolatileAssignment(Expr *E) {
1831118311
}
1831218312

1831318313
void Sema::MarkExpressionAsImmediateEscalating(Expr *E) {
18314-
assert(!FunctionScopes.empty() && "Expected a function scope");
1831518314
assert(getLangOpts().CPlusPlus20 &&
1831618315
ExprEvalContexts.back().InImmediateEscalatingFunctionContext &&
1831718316
"Cannot mark an immediate escalating expression outside of an "
@@ -18328,7 +18327,8 @@ void Sema::MarkExpressionAsImmediateEscalating(Expr *E) {
1832818327
} else {
1832918328
assert(false && "expected an immediately escalating expression");
1833018329
}
18331-
getCurFunction()->FoundImmediateEscalatingExpression = true;
18330+
if (FunctionScopeInfo *FI = getCurFunction())
18331+
FI->FoundImmediateEscalatingExpression = true;
1833218332
}
1833318333

1833418334
ExprResult Sema::CheckForImmediateInvocation(ExprResult E, FunctionDecl *Decl) {

clang/test/SemaCXX/cxx2b-consteval-propagate.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,3 +368,29 @@ vector<void> v{};
368368
// expected-note@-2 {{in call to 'vector()'}}
369369

370370
}
371+
372+
373+
namespace GH82258 {
374+
375+
template <class R, class Pred>
376+
constexpr auto none_of(R&& r, Pred pred) -> bool { return true; }
377+
378+
struct info { int value; };
379+
consteval auto is_invalid(info i) -> bool { return false; }
380+
constexpr info types[] = { {1}, {3}, {5}};
381+
382+
static_assert(none_of(
383+
types,
384+
+[](info i) consteval {
385+
return is_invalid(i);
386+
}
387+
));
388+
389+
static_assert(none_of(
390+
types,
391+
[]{
392+
return is_invalid;
393+
}()
394+
));
395+
396+
}

0 commit comments

Comments
 (0)