summaryrefslogtreecommitdiff
path: root/flang
diff options
context:
space:
mode:
authorSlava Zakharin <szakharin@nvidia.com>2023-05-15 21:10:18 -0700
committerSlava Zakharin <szakharin@nvidia.com>2023-05-16 09:51:09 -0700
commite47fbb7cd2d22b787d1022fd2f3bef4a051d67c8 (patch)
tree389fc882117d77a92c286740ab2ac5cb2e1a9ca5 /flang
parent76941b68ecd9a1f9ca337774b4082c2ca7577450 (diff)
downloadllvm-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.h1
-rw-r--r--flang/lib/Evaluate/constant.cpp6
-rw-r--r--flang/test/Lower/constant-literal-mangling.f908
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}>> {