diff options
Diffstat (limited to 'flang/lib/Semantics/pointer-assignment.cpp')
-rw-r--r-- | flang/lib/Semantics/pointer-assignment.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/flang/lib/Semantics/pointer-assignment.cpp b/flang/lib/Semantics/pointer-assignment.cpp index 761d664..dc5611c 100644 --- a/flang/lib/Semantics/pointer-assignment.cpp +++ b/flang/lib/Semantics/pointer-assignment.cpp @@ -45,7 +45,7 @@ public: PointerAssignmentChecker(evaluate::FoldingContext &context, const Symbol &lhs) : context_{context}, source_{lhs.name()}, description_{"pointer '"s + lhs.name().ToString() + '\''}, lhs_{&lhs}, - procedure_{Procedure::Characterize(lhs, context.intrinsics())} { + procedure_{Procedure::Characterize(lhs, context)} { set_lhsType(TypeAndShape::Characterize(lhs, context)); set_isContiguous(lhs.attrs().test(Attr::CONTIGUOUS)); set_isVolatile(lhs.attrs().test(Attr::VOLATILE)); @@ -143,7 +143,7 @@ bool PointerAssignmentChecker::Check(const evaluate::FunctionRef<T> &f) { } else if (const auto *intrinsic{f.proc().GetSpecificIntrinsic()}) { funcName = intrinsic->name; } - auto proc{Procedure::Characterize(f.proc(), context_.intrinsics())}; + auto proc{Procedure::Characterize(f.proc(), context_)}; if (!proc) { return false; } @@ -262,7 +262,7 @@ bool PointerAssignmentChecker::Check( } bool PointerAssignmentChecker::Check(const evaluate::ProcedureDesignator &d) { - if (auto chars{Procedure::Characterize(d, context_.intrinsics())}) { + if (auto chars{Procedure::Characterize(d, context_)}) { return Check(d.GetName(), false, &*chars); } else { return Check(d.GetName(), false); @@ -271,7 +271,7 @@ bool PointerAssignmentChecker::Check(const evaluate::ProcedureDesignator &d) { bool PointerAssignmentChecker::Check(const evaluate::ProcedureRef &ref) { const Procedure *procedure{nullptr}; - auto chars{Procedure::Characterize(ref, context_.intrinsics())}; + auto chars{Procedure::Characterize(ref, context_)}; if (chars) { procedure = &*chars; if (chars->functionResult) { @@ -299,10 +299,13 @@ bool PointerAssignmentChecker::LhsOkForUnlimitedPoly() const { template <typename... A> parser::Message *PointerAssignmentChecker::Say(A &&...x) { auto *msg{context_.messages().Say(std::forward<A>(x)...)}; - if (lhs_) { - return evaluate::AttachDeclaration(msg, *lhs_); - } else if (!source_.empty()) { - msg->Attach(source_, "Declaration of %s"_en_US, description_); + if (msg) { + if (lhs_) { + return evaluate::AttachDeclaration(msg, *lhs_); + } + if (!source_.empty()) { + msg->Attach(source_, "Declaration of %s"_en_US, description_); + } } return msg; } @@ -358,7 +361,7 @@ static bool CheckPointerBounds( } } if (isBoundsRemapping && rhs.Rank() != 1 && - !evaluate::IsSimplyContiguous(rhs, context.intrinsics())) { + !evaluate::IsSimplyContiguous(rhs, context)) { messages.Say("Pointer bounds remapping target must have rank 1 or be" " simply contiguous"_err_en_US); // 10.2.2.3(9) } |