forked from OSchip/llvm-project
[flang] Fix to UnwrapConvertedExpr()
The utility UnwrapConvertedExpr() was failing to unwrap a converted TypeParamInquiry operation when called from runtime derived type description table construction, leading to an abort in semantics. Differential Revision: https://reviews.llvm.org/D125119
This commit is contained in:
parent
b554c643c5
commit
6f14dbedd9
|
@ -219,16 +219,22 @@ auto UnwrapConvertedExpr(B &x) -> common::Constify<A, B> * {
|
|||
} else if constexpr (std::is_same_v<Ty, Expr<SomeType>>) {
|
||||
return common::visit(
|
||||
[](auto &x) { return UnwrapConvertedExpr<A>(x); }, x.u);
|
||||
} else if constexpr (!common::HasMember<A, TypelessExpression>) {
|
||||
using Result = ResultType<A>;
|
||||
if constexpr (std::is_same_v<Ty, Expr<Result>> ||
|
||||
std::is_same_v<Ty, Expr<SomeKind<Result::category>>>) {
|
||||
} else {
|
||||
using DesiredResult = ResultType<A>;
|
||||
if constexpr (std::is_same_v<Ty, Expr<DesiredResult>> ||
|
||||
std::is_same_v<Ty, Expr<SomeKind<DesiredResult::category>>>) {
|
||||
return common::visit(
|
||||
[](auto &x) { return UnwrapConvertedExpr<A>(x); }, x.u);
|
||||
} else if constexpr (std::is_same_v<Ty, Parentheses<Result>> ||
|
||||
std::is_same_v<Ty, Convert<Result, Result::category>>) {
|
||||
return common::visit(
|
||||
[](auto &x) { return UnwrapConvertedExpr<A>(x); }, x.left().u);
|
||||
} else {
|
||||
using ThisResult = ResultType<B>;
|
||||
if constexpr (std::is_same_v<Ty, Expr<ThisResult>>) {
|
||||
return common::visit(
|
||||
[](auto &x) { return UnwrapConvertedExpr<A>(x); }, x.u);
|
||||
} else if constexpr (std::is_same_v<Ty, Parentheses<ThisResult>> ||
|
||||
std::is_same_v<Ty, Convert<ThisResult, DesiredResult::category>>) {
|
||||
return common::visit(
|
||||
[](auto &x) { return UnwrapConvertedExpr<A>(x); }, x.left().u);
|
||||
}
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
|
|
Loading…
Reference in New Issue