From: Slava Zakharin Date: Tue, 16 May 2023 04:10:18 +0000 (-0700) Subject: [flang] Fixed comparison for derived types constants. X-Git-Tag: upstream/17.0.6~8313 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e47fbb7cd2d22b787d1022fd2f3bef4a051d67c8;p=platform%2Fupstream%2Fllvm.git [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 --- 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}>> {