Skip to content

Commit a7a74ec

Browse files
cor3ntintstellar
authored andcommitted
[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 (cherry picked from commit baf6bd3)
1 parent 4cc7a75 commit a7a74ec

File tree

4 files changed

+36
-3
lines changed

4 files changed

+36
-3
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,6 +1099,11 @@ Bug Fixes to C++ Support
10991099
- Fix incorrect code generation caused by the object argument of ``static operator()`` and ``static operator[]`` calls not being evaluated.
11001100
Fixes (`#67976 <https://github.com/llvm/llvm-project/issues/67976>`_)
11011101

1102+
- Fix crash when using an immediate-escalated function at global scope.
1103+
(`#82258 <https://github.com/llvm/llvm-project/issues/82258>`_)
1104+
- Correctly immediate-escalate lambda conversion functions.
1105+
(`#82258 <https://github.com/llvm/llvm-project/issues/82258>`_)
1106+
11021107
Bug Fixes to AST Handling
11031108
^^^^^^^^^^^^^^^^^^^^^^^^^
11041109
- Fixed an import failure of recursive friend class template.

clang/include/clang/Sema/Sema.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1090,7 +1090,9 @@ class Sema final {
10901090
if (FD) {
10911091
FD->setWillHaveBody(true);
10921092
S.ExprEvalContexts.back().InImmediateFunctionContext =
1093-
FD->isImmediateFunction();
1093+
FD->isImmediateFunction() ||
1094+
S.ExprEvalContexts[S.ExprEvalContexts.size() - 2]
1095+
.isConstantEvaluated();
10941096
S.ExprEvalContexts.back().InImmediateEscalatingFunctionContext =
10951097
S.getLangOpts().CPlusPlus20 && FD->isImmediateEscalating();
10961098
} else

clang/lib/Sema/SemaExpr.cpp

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

1829618296
void Sema::MarkExpressionAsImmediateEscalating(Expr *E) {
18297-
assert(!FunctionScopes.empty() && "Expected a function scope");
1829818297
assert(getLangOpts().CPlusPlus20 &&
1829918298
ExprEvalContexts.back().InImmediateEscalatingFunctionContext &&
1830018299
"Cannot mark an immediate escalating expression outside of an "
@@ -18311,7 +18310,8 @@ void Sema::MarkExpressionAsImmediateEscalating(Expr *E) {
1831118310
} else {
1831218311
assert(false && "expected an immediately escalating expression");
1831318312
}
18314-
getCurFunction()->FoundImmediateEscalatingExpression = true;
18313+
if (FunctionScopeInfo *FI = getCurFunction())
18314+
FI->FoundImmediateEscalatingExpression = true;
1831518315
}
1831618316

1831718317
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)