diff options
author | Slava Zakharin <szakharin@nvidia.com> | 2023-05-15 21:10:18 -0700 |
---|---|---|
committer | Slava Zakharin <szakharin@nvidia.com> | 2023-05-16 09:51:09 -0700 |
commit | e47fbb7cd2d22b787d1022fd2f3bef4a051d67c8 (patch) | |
tree | 389fc882117d77a92c286740ab2ac5cb2e1a9ca5 /flang | |
parent | 76941b68ecd9a1f9ca337774b4082c2ca7577450 (diff) | |
download | llvm-e47fbb7cd2d22b787d1022fd2f3bef4a051d67c8.tar.gz |
[flang] Fixed comparison for derived types constants.
The two constants should be equal only if their derived types
are the same. This fixes regression caused by D150380.
Differential Revision: https://reviews.llvm.org/D150634
Diffstat (limited to 'flang')
-rw-r--r-- | flang/include/flang/Evaluate/constant.h | 1 | ||||
-rw-r--r-- | flang/lib/Evaluate/constant.cpp | 6 | ||||
-rw-r--r-- | flang/test/Lower/constant-literal-mangling.f90 | 8 |
3 files changed, 15 insertions, 0 deletions
diff --git a/flang/include/flang/Evaluate/constant.h b/flang/include/flang/Evaluate/constant.h index 611ee7772d2a..73e4271cc28a 100644 --- a/flang/include/flang/Evaluate/constant.h +++ b/flang/include/flang/Evaluate/constant.h @@ -225,6 +225,7 @@ public: std::optional<StructureConstructor> GetScalarValue() const; StructureConstructor At(const ConstantSubscripts &) const; + bool operator==(const Constant &) const; Constant Reshape(ConstantSubscripts &&) const; std::size_t CopyFrom(const Constant &source, std::size_t count, ConstantSubscripts &resultSubscripts, const std::vector<int> *dimOrder); diff --git a/flang/lib/Evaluate/constant.cpp b/flang/lib/Evaluate/constant.cpp index 1a4d30cf9d14..c94b198fdaf2 100644 --- a/flang/lib/Evaluate/constant.cpp +++ b/flang/lib/Evaluate/constant.cpp @@ -346,6 +346,12 @@ StructureConstructor Constant<SomeDerived>::At( return {result().derivedTypeSpec(), values_.at(SubscriptsToOffset(index))}; } +bool Constant<SomeDerived>::operator==( + const Constant<SomeDerived> &that) const { + return result().derivedTypeSpec() == that.result().derivedTypeSpec() && + shape() == that.shape() && values_ == that.values_; +} + auto Constant<SomeDerived>::Reshape(ConstantSubscripts &&dims) const -> Constant { return {result().derivedTypeSpec(), Base::Reshape(dims), std::move(dims)}; diff --git a/flang/test/Lower/constant-literal-mangling.f90 b/flang/test/Lower/constant-literal-mangling.f90 index ef33ffe450b0..33a658fb61cd 100644 --- a/flang/test/Lower/constant-literal-mangling.f90 +++ b/flang/test/Lower/constant-literal-mangling.f90 @@ -9,6 +9,12 @@ type otherType integer :: i end type +type emptyType1 +end type emptyType1 + +type emptyType2 +end type emptyType2 + print *, [42, 42] ! CHECK: fir.address_of(@_QQro.2xi4.0) @@ -68,6 +74,8 @@ end type print *, [otherType(42)] ! CHECK: fir.address_of(@_QQro.1x_QFTothertype.14) + print *, [emptyType1()] + print *, [emptyType2()] end ! CHECK: fir.global internal @_QQro.1x_QFTsometype.10 constant : !fir.array<1x!fir.type<_QFTsometype{i:i32}>> { |