mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-23 05:40:09 +00:00
[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 baf6bd303bd58a521809d456dd9b179636982fc5)
This commit is contained in:
parent
4cc7a75aa6
commit
a7a74ece1d
@ -1099,6 +1099,11 @@ Bug Fixes to C++ Support
|
||||
- Fix incorrect code generation caused by the object argument of ``static operator()`` and ``static operator[]`` calls not being evaluated.
|
||||
Fixes (`#67976 <https://github.com/llvm/llvm-project/issues/67976>`_)
|
||||
|
||||
- Fix crash when using an immediate-escalated function at global scope.
|
||||
(`#82258 <https://github.com/llvm/llvm-project/issues/82258>`_)
|
||||
- Correctly immediate-escalate lambda conversion functions.
|
||||
(`#82258 <https://github.com/llvm/llvm-project/issues/82258>`_)
|
||||
|
||||
Bug Fixes to AST Handling
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
- Fixed an import failure of recursive friend class template.
|
||||
|
@ -1090,7 +1090,9 @@ public:
|
||||
if (FD) {
|
||||
FD->setWillHaveBody(true);
|
||||
S.ExprEvalContexts.back().InImmediateFunctionContext =
|
||||
FD->isImmediateFunction();
|
||||
FD->isImmediateFunction() ||
|
||||
S.ExprEvalContexts[S.ExprEvalContexts.size() - 2]
|
||||
.isConstantEvaluated();
|
||||
S.ExprEvalContexts.back().InImmediateEscalatingFunctionContext =
|
||||
S.getLangOpts().CPlusPlus20 && FD->isImmediateEscalating();
|
||||
} else
|
||||
|
@ -18294,7 +18294,6 @@ void Sema::CheckUnusedVolatileAssignment(Expr *E) {
|
||||
}
|
||||
|
||||
void Sema::MarkExpressionAsImmediateEscalating(Expr *E) {
|
||||
assert(!FunctionScopes.empty() && "Expected a function scope");
|
||||
assert(getLangOpts().CPlusPlus20 &&
|
||||
ExprEvalContexts.back().InImmediateEscalatingFunctionContext &&
|
||||
"Cannot mark an immediate escalating expression outside of an "
|
||||
@ -18311,7 +18310,8 @@ void Sema::MarkExpressionAsImmediateEscalating(Expr *E) {
|
||||
} else {
|
||||
assert(false && "expected an immediately escalating expression");
|
||||
}
|
||||
getCurFunction()->FoundImmediateEscalatingExpression = true;
|
||||
if (FunctionScopeInfo *FI = getCurFunction())
|
||||
FI->FoundImmediateEscalatingExpression = true;
|
||||
}
|
||||
|
||||
ExprResult Sema::CheckForImmediateInvocation(ExprResult E, FunctionDecl *Decl) {
|
||||
|
@ -368,3 +368,29 @@ vector<void> v{};
|
||||
// expected-note@-2 {{in call to 'vector()'}}
|
||||
|
||||
}
|
||||
|
||||
|
||||
namespace GH82258 {
|
||||
|
||||
template <class R, class Pred>
|
||||
constexpr auto none_of(R&& r, Pred pred) -> bool { return true; }
|
||||
|
||||
struct info { int value; };
|
||||
consteval auto is_invalid(info i) -> bool { return false; }
|
||||
constexpr info types[] = { {1}, {3}, {5}};
|
||||
|
||||
static_assert(none_of(
|
||||
types,
|
||||
+[](info i) consteval {
|
||||
return is_invalid(i);
|
||||
}
|
||||
));
|
||||
|
||||
static_assert(none_of(
|
||||
types,
|
||||
[]{
|
||||
return is_invalid;
|
||||
}()
|
||||
));
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user