@@ -145,17 +145,15 @@ Fortran::lower::CharacterExprHelper::createEmbox(const fir::CharBoxValue &box) {
145
145
auto boxCharType = fir::BoxCharType::get (builder.getContext (), kind);
146
146
auto refType = getReferenceType (str);
147
147
// So far, fir.emboxChar fails lowering to llvm when it is given
148
- // fir.data <fir.array<len x fir.char<kind>>> types, so convert to
149
- // fir.data <fir.char<kind>> if needed.
148
+ // fir.ref <fir.array<len x fir.char<kind>>> types, so convert to
149
+ // fir.ref <fir.char<kind>> if needed.
150
150
auto buff = str.getBuffer ();
151
- if (refType != str.getBuffer ().getType ())
152
- buff = builder.createConvert (loc, refType, buff);
151
+ buff = builder.createConvert (loc, refType, buff);
153
152
// Convert in case the provided length is not of the integer type that must
154
153
// be used in boxchar.
155
154
auto lenType = getLengthType ();
156
155
auto len = str.getLen ();
157
- if (str.getLen ().getType () != lenType)
158
- len = builder.createConvert (loc, lenType, len);
156
+ len = builder.createConvert (loc, lenType, len);
159
157
return builder.create <fir::EmboxCharOp>(loc, boxCharType, buff, len);
160
158
}
161
159
@@ -212,16 +210,20 @@ Fortran::lower::CharacterExprHelper::createTemp(mlir::Type type,
212
210
void Fortran::lower::CharacterExprHelper::createLengthOneAssign (
213
211
const fir::CharBoxValue &lhs, const fir::CharBoxValue &rhs) {
214
212
auto addr = lhs.getBuffer ();
215
- auto refType = getReferenceType (lhs);
216
- addr = builder.createConvert (loc, refType, addr);
217
-
218
213
auto val = rhs.getBuffer ();
219
- if (!needToMaterialize (rhs)) {
220
- mlir::Value rhsAddr = rhs.getBuffer ();
221
- rhsAddr = builder.createConvert (loc, refType, rhsAddr);
222
- val = builder.create <fir::LoadOp>(loc, rhsAddr);
214
+ // If rhs value resides in memory, load it.
215
+ if (!needToMaterialize (rhs))
216
+ val = builder.create <fir::LoadOp>(loc, val);
217
+ auto valTy = val.getType ();
218
+ // Precondition is rhs is size 1, but it may be wrapped in a fir.array.
219
+ if (auto seqTy = valTy.dyn_cast <fir::SequenceType>()) {
220
+ auto zero = builder.createIntegerConstant (loc, builder.getIndexType (), 0 );
221
+ valTy = seqTy.getEleTy ();
222
+ val = builder.create <fir::ExtractValueOp>(loc, valTy, val, zero);
223
223
}
224
-
224
+ auto addrTy = fir::ReferenceType::get (valTy);
225
+ addr = builder.createConvert (loc, addrTy, addr);
226
+ assert (fir::dyn_cast_ptrEleTy (addr.getType ()) == val.getType ());
225
227
builder.create <fir::StoreOp>(loc, val, addr);
226
228
}
227
229
0 commit comments