diff options
author | jeanPerier <jperier@nvidia.com> | 2024-06-24 10:21:04 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-24 10:21:04 +0200 |
commit | 73cf014223fed1947f725f7debcf19b8f54448b5 (patch) | |
tree | 95874478a5f4452ff5e99d83e6755326ec86a34d /flang/lib/Semantics/pointer-assignment.cpp | |
parent | 33676ba543737f8e286e28a9cae81a848bdd3f09 (diff) | |
download | llvm-73cf014223fed1947f725f7debcf19b8f54448b5.zip llvm-73cf014223fed1947f725f7debcf19b8f54448b5.tar.gz llvm-73cf014223fed1947f725f7debcf19b8f54448b5.tar.bz2 |
[flang] harden TypeAndShape for assumed-ranks (#96234)
SIZEOF and C_SIZEOF were broken for assumed-ranks because
`TypeAndShape::MeasureSizeInBytes` behaved as a scalar because the
`TypeAndShape::shape_` member was the same for scalar and assumed-ranks.
The easy fix would have been to add special handling in
`MeasureSizeInBytes` for assumed-ranks using the TypeAndShape
attributes, but I think this solution would leave `TypeAndShape::shape_`
manipulation fragile to future developers. Hence, I went for the
solution that turn shape_ into a `std::optional<Shape>`.
Diffstat (limited to 'flang/lib/Semantics/pointer-assignment.cpp')
-rw-r--r-- | flang/lib/Semantics/pointer-assignment.cpp | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/flang/lib/Semantics/pointer-assignment.cpp b/flang/lib/Semantics/pointer-assignment.cpp index 0770720..a5c3897 100644 --- a/flang/lib/Semantics/pointer-assignment.cpp +++ b/flang/lib/Semantics/pointer-assignment.cpp @@ -333,8 +333,8 @@ bool PointerAssignmentChecker::Check(const evaluate::Designator<T> &d) { } else if (!isBoundsRemapping_ && !lhsType_->attrs().test(TypeAndShape::Attr::AssumedRank)) { - int lhsRank{evaluate::GetRank(lhsType_->shape())}; - int rhsRank{evaluate::GetRank(rhsType->shape())}; + int lhsRank{lhsType_->Rank()}; + int rhsRank{rhsType->Rank()}; if (lhsRank != rhsRank) { msg = MessageFormattedText{ "Pointer has rank %d but target has rank %d"_err_en_US, lhsRank, |