mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-03-04 16:41:43 +00:00
[Clang] Fix a crash when an invalid immediate function call appears in a cast
Fixes #64949 Reviewed By: Fznamznon, erichkeane, shafik Differential Revision: https://reviews.llvm.org/D158733
This commit is contained in:
parent
79ff70fda2
commit
6824d156d5
@ -206,6 +206,10 @@ Bug Fixes to C++ Support
|
||||
of a binary comparision.
|
||||
(`#64923 <https://github.com/llvm/llvm-project/issues/64923>_``)
|
||||
|
||||
- Fix a crash when an immediate invocation is not a constant expression
|
||||
and appear in an implicit cast.
|
||||
(`#64949 <https://github.com/llvm/llvm-project/issues/64949>`_).
|
||||
|
||||
Bug Fixes to AST Handling
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
- Fixed an import failure of recursive friend class template.
|
||||
|
@ -18352,15 +18352,17 @@ static void EvaluateAndDiagnoseImmediateInvocation(
|
||||
SemaRef.FailedImmediateInvocations.insert(CE);
|
||||
Expr *InnerExpr = CE->getSubExpr()->IgnoreImplicit();
|
||||
if (auto *FunctionalCast = dyn_cast<CXXFunctionalCastExpr>(InnerExpr))
|
||||
InnerExpr = FunctionalCast->getSubExpr();
|
||||
InnerExpr = FunctionalCast->getSubExpr()->IgnoreImplicit();
|
||||
FunctionDecl *FD = nullptr;
|
||||
if (auto *Call = dyn_cast<CallExpr>(InnerExpr))
|
||||
FD = cast<FunctionDecl>(Call->getCalleeDecl());
|
||||
else if (auto *Call = dyn_cast<CXXConstructExpr>(InnerExpr))
|
||||
FD = Call->getConstructor();
|
||||
else
|
||||
llvm_unreachable("unhandled decl kind");
|
||||
assert(FD && FD->isImmediateFunction());
|
||||
else if (auto *Cast = dyn_cast<CastExpr>(InnerExpr))
|
||||
FD = dyn_cast_or_null<FunctionDecl>(Cast->getConversionFunction());
|
||||
|
||||
assert(FD && FD->isImmediateFunction() &&
|
||||
"could not find an immediate function in this expression");
|
||||
SemaRef.Diag(CE->getBeginLoc(), diag::err_invalid_consteval_call)
|
||||
<< FD << FD->isConsteval();
|
||||
if (auto Context =
|
||||
|
@ -1103,3 +1103,27 @@ void bar() {
|
||||
// expected-note {{read of non-const variable 'bad' is not allowed in a constant expression}}
|
||||
}
|
||||
}
|
||||
|
||||
namespace GH64949 {
|
||||
struct f {
|
||||
int g; // expected-note 2{{subobject declared here}}
|
||||
constexpr ~f() {}
|
||||
};
|
||||
class h {
|
||||
|
||||
public:
|
||||
consteval h(char *) {}
|
||||
consteval operator int() const { return 1; }
|
||||
f i;
|
||||
};
|
||||
|
||||
void test() { (int)h{nullptr}; }
|
||||
// expected-error@-1 {{call to consteval function 'GH64949::h::h' is not a constant expression}}
|
||||
// expected-note@-2 {{subobject 'g' is not initialized}}
|
||||
|
||||
int test2() { return h{nullptr}; }
|
||||
// expected-error@-1 {{call to consteval function 'GH64949::h::h' is not a constant expression}}
|
||||
// expected-note@-2 {{subobject 'g' is not initialized}}
|
||||
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user