summaryrefslogtreecommitdiffstats
path: root/flang/lib/Lower/ConvertExprToHLFIR.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'flang/lib/Lower/ConvertExprToHLFIR.cpp')
-rw-r--r--flang/lib/Lower/ConvertExprToHLFIR.cpp27
1 files changed, 15 insertions, 12 deletions
diff --git a/flang/lib/Lower/ConvertExprToHLFIR.cpp b/flang/lib/Lower/ConvertExprToHLFIR.cpp
index 731c5072c45c..c5bfbdf6b8c1 100644
--- a/flang/lib/Lower/ConvertExprToHLFIR.cpp
+++ b/flang/lib/Lower/ConvertExprToHLFIR.cpp
@@ -761,9 +761,17 @@ private:
// of the whole designator (not the ones of the vector subscripted part).
// These are not yet known and will be added when finalizing the designator
// lowering.
- auto elementalAddrOp =
- builder.create<hlfir::ElementalAddrOp>(loc, shape,
- /*isUnordered=*/true);
+ // The resulting designator may be polymorphic, in which case the resulting
+ // type is the base of the vector subscripted part because
+ // allocatable/pointer components cannot be referenced after a vector
+ // subscripted part. Set the mold to the current base. It will be erased if
+ // the resulting designator is not polymorphic.
+ assert(partInfo.base.has_value() &&
+ "vector subscripted part must have a base");
+ mlir::Value mold = *partInfo.base;
+ auto elementalAddrOp = builder.create<hlfir::ElementalAddrOp>(
+ loc, shape, mold, mlir::ValueRange{},
+ /*isUnordered=*/true);
setVectorSubscriptElementAddrOp(elementalAddrOp);
builder.setInsertionPointToEnd(&elementalAddrOp.getBody().front());
mlir::Region::BlockArgListType indices = elementalAddrOp.getIndices();
@@ -804,15 +812,8 @@ private:
hlfir::EntityWithAttributes elementAddr) {
fir::FirOpBuilder &builder = getBuilder();
builder.setInsertionPointToEnd(&elementalAddrOp.getBody().front());
- // For polymorphic entities, it will be needed to add a mold on the
- // hlfir.elemental so that we are able to create temporary storage
- // for it using the dynamic type. It seems that a reference to the mold
- // entity can be created by evaluating the hlfir.elemental_addr
- // for a single index. The evaluation should be legal as long as
- // the hlfir.elemental_addr has no side effects, otherwise,
- // it is not clear how to get the mold reference.
- if (elementAddr.isPolymorphic())
- TODO(loc, "vector subscripted polymorphic entity in HLFIR");
+ if (!elementAddr.isPolymorphic())
+ elementalAddrOp.getMoldMutable().clear();
builder.create<hlfir::YieldOp>(loc, elementAddr);
builder.setInsertionPointAfter(elementalAddrOp);
}
@@ -929,6 +930,8 @@ HlfirDesignatorBuilder::convertVectorSubscriptedExprToElementalAddr(
hlfir::genLengthParameters(loc, builder, elementAddrEntity, lengths);
if (!lengths.empty())
elementalAddrOp.getTypeparamsMutable().assign(lengths);
+ if (!elementAddrEntity.isPolymorphic())
+ elementalAddrOp.getMoldMutable().clear();
// Create the hlfir.yield terminator inside the hlfir.elemental_body.
builder.setInsertionPointToEnd(&elementalAddrOp.getBody().front());
builder.create<hlfir::YieldOp>(loc, elementAddrEntity);