Recent commits (
2098ad7f00324ee0f2a6538f418a6f81dfdd2edb and
15a9a72ee68166c0cff3f036cacd3c82be66c729) replaced usage of "o.value()"
on optionals with "*o". Those optional values are expected to be
present -- but now, if it ever turns out that they're not,
compilation will proceed with garbage data rather than crashing
immediately (and more debuggably) with an uncaught exception.
Add asserts for presence to restore the previous level of safety.
(I could have revert these patches so as to resume used of .value()
but I didn't want to just have them get broken again.)
Differential Revision: https://reviews.llvm.org/D140340
template <TypeCategory TOCAT, typename VALUE>
common::IfNoLvalue<Expr<SomeKind<TOCAT>>, VALUE> ConvertToKind(
int kind, VALUE &&x) {
- return *common::SearchTypes(
- ConvertToKindHelper<TOCAT, VALUE>{kind, std::move(x)});
+ auto result{common::SearchTypes(
+ ConvertToKindHelper<TOCAT, VALUE>{kind, std::move(x)})};
+ CHECK(result.has_value());
+ return *result;
}
// Given a type category CAT, SameKindExprs<CAT, N> is a variant that
} else {
llvm_unreachable("unknown category");
}
- if (lhsIsWholeAllocatable)
+ if (lhsIsWholeAllocatable) {
+ assert(lhsRealloc.has_value());
fir::factory::finalizeRealloc(*builder, loc, *lhsMutableBox,
/*lbounds=*/std::nullopt,
/*takeLboundsIfRealloc=*/false,
*lhsRealloc);
+ }
},
// [2] User defined assignment. If the context is a scalar
callNumResults = call.getNumResults();
}
- if (caller.mustSaveResult())
+ if (caller.mustSaveResult()) {
+ assert(allocatedResult.has_value());
builder.create<fir::SaveResultOp>(loc, callResult,
fir::getBase(*allocatedResult),
arrayResultShape, resultLengths);
+ }
if (allocatedResult) {
allocatedResult->match(
mlir::Value oldInnerArg = modifyOp.getSequence();
std::size_t offset = explicitSpace->argPosition(oldInnerArg);
explicitSpace->setInnerArg(offset, fir::getBase(lexv));
- fir::ExtendedValue exv = arrayModifyToExv(
- builder, loc, *explicitSpace->getLhsLoad(0), modifyOp.getResult(0));
+ auto lhsLoad = explicitSpace->getLhsLoad(0);
+ assert(lhsLoad.has_value());
+ fir::ExtendedValue exv =
+ arrayModifyToExv(builder, loc, *lhsLoad, modifyOp.getResult(0));
genScalarUserDefinedAssignmentCall(builder, loc, userAssignment, exv,
elementalExv);
} else {
}
mlir::Value val = builder.createConvert(loc, eleTy, origVal);
if (isBoundsSpec()) {
+ assert(lbounds.has_value());
auto lbs = *lbounds;
if (lbs.size() > 0) {
// Rebox the value with user-specified shift.
mlir::Value{});
}
} else if (isBoundsRemap()) {
+ assert(lbounds.has_value());
auto lbs = *lbounds;
if (lbs.size() > 0) {
// Rebox the value with user-specified shift and shape.
+ assert(ubounds.has_value());
auto shapeShiftArgs = flatZip(lbs, *ubounds);
auto shapeTy = fir::ShapeShiftType::get(eleTy.getContext(), lbs.size());
mlir::Value shapeShift =
charLen = builder.createTemporary(loc, builder.getI64Type());
mlir::Value castLen =
builder.createConvert(loc, builder.getI64Type(), fir::getLen(exv));
+ assert(charLen.has_value());
builder.create<fir::StoreOp>(loc, castLen, *charLen);
}
}
// Convert to extended value.
if (fir::isa_char(seqTy.getEleTy())) {
+ assert(charLen.has_value());
auto len = builder.create<fir::LoadOp>(loc, *charLen);
return {fir::CharArrayBoxValue{mem, len, extents}, /*needCopy=*/false};
}
gen(const Fortran::evaluate::FunctionRef<T> &expr) {
mlir::Type resType =
Fortran::lower::TypeBuilder<T>::genType(getConverter(), expr);
- return *Fortran::lower::convertCallToHLFIR(
+ auto result = Fortran::lower::convertCallToHLFIR(
getLoc(), getConverter(), expr, resType, getSymMap(), getStmtCtx());
+ assert(result.has_value());
+ return *result;
}
template <typename T>
llvm::SmallVector<fir::ExtendedValue> args;
args.push_back(getOperand(0));
args.push_back(getOperand(1));
+ auto iPC = isPresentCheck(2);
+ assert(iPC.has_value());
args.push_back(builder
- .genIfOp(loc, {resultType}, *isPresentCheck(2),
+ .genIfOp(loc, {resultType}, *iPC,
/*withElseRegion=*/true)
.genThen([&]() {
fir::ExtendedValue sizeExv = getOperand(2);