template<typename RESULT> struct ArrayConstructorValue {
using Result = RESULT;
EVALUATE_UNION_CLASS_BOILERPLATE(ArrayConstructorValue)
- std::variant<common::CopyableIndirection<Expr<Result>>, ImpliedDo<Result>> u;
+ std::variant<Expr<Result>, ImpliedDo<Result>> u;
};
template<typename RESULT> class ArrayConstructorValues {
}
template<typename T>
-std::ostream &EmitArray(
- std::ostream &o, const common::CopyableIndirection<Expr<T>> &expr) {
- return expr.value().AsFortran(o);
+std::ostream &EmitArray(std::ostream &o, const Expr<T> &expr) {
+ return expr.AsFortran(o);
}
template<typename T>
if (auto *constructor{UnwrapExpr<ArrayConstructor<ExtentType>>(arrayExpr)}) {
Shape result;
for (const auto &value : constructor->values()) {
- if (const auto *expr{
- std::get_if<common::CopyableIndirection<ExtentExpr>>(&value.u)}) {
- if (expr->value().Rank() == 0) {
- result.emplace_back(std::move(expr->value()));
+ if (const auto *expr{std::get_if<ExtentExpr>(&value.u)}) {
+ if (expr->Rank() == 0) {
+ result.emplace_back(std::move(*expr));
continue;
}
}
MaybeExtent GetExtent(const ArrayConstructorValue<T> &value) {
return std::visit(
common::visitors{
- [](const common::CopyableIndirection<Expr<T>> &x) -> MaybeExtent {
+ [](const Expr<T> &x) -> MaybeExtent {
if (std::optional<Shape> xShape{GetShape(x)}) {
// Array values in array constructors get linearized.
return GetSize(std::move(*xShape));