From e47fbb7cd2d22b787d1022fd2f3bef4a051d67c8 Mon Sep 17 00:00:00 2001 From: Slava Zakharin Date: Mon, 15 May 2023 21:10:18 -0700 Subject: [PATCH] [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 --- flang/include/flang/Evaluate/constant.h | 1 + flang/lib/Evaluate/constant.cpp | 6 ++++++ flang/test/Lower/constant-literal-mangling.f90 | 8 ++++++++ 3 files changed, 15 insertions(+) diff --git a/flang/include/flang/Evaluate/constant.h b/flang/include/flang/Evaluate/constant.h index 611ee77..73e4271 100644 --- a/flang/include/flang/Evaluate/constant.h +++ b/flang/include/flang/Evaluate/constant.h @@ -225,6 +225,7 @@ public: std::optional 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 *dimOrder); diff --git a/flang/lib/Evaluate/constant.cpp b/flang/lib/Evaluate/constant.cpp index 1a4d30c..c94b198 100644 --- a/flang/lib/Evaluate/constant.cpp +++ b/flang/lib/Evaluate/constant.cpp @@ -346,6 +346,12 @@ StructureConstructor Constant::At( return {result().derivedTypeSpec(), values_.at(SubscriptsToOffset(index))}; } +bool Constant::operator==( + const Constant &that) const { + return result().derivedTypeSpec() == that.result().derivedTypeSpec() && + shape() == that.shape() && values_ == that.values_; +} + auto Constant::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 ef33ffe..33a658f 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}>> { -- 2.7.4