@@ -545,9 +545,51 @@ class IsEqualEvaluateExpr {
545
545
return isEqual (x.proc (), y.proc ()) && isEqual (x.arguments (), y.arguments ());
546
546
}
547
547
template <typename A>
548
+ static bool isEqual (const Fortran::evaluate::ImpliedDo<A> &x,
549
+ const Fortran::evaluate::ImpliedDo<A> &y) {
550
+ using Expr = Fortran::evaluate::Expr<A>;
551
+ for (const auto &[xValue, yValue] : llvm::zip (x.values (), y.values ())) {
552
+ bool checkValue = Fortran::common::visit (
553
+ common::visitors{
554
+ [&](const Expr &v, const Expr &w) { return isEqual (v, w); },
555
+ [&](const auto &, const auto &) {
556
+ llvm::report_fatal_error (" isEqual is not handled yet for "
557
+ " the element type in ImpliedDo" );
558
+ return false ;
559
+ },
560
+ },
561
+ xValue.u , yValue.u );
562
+ if (!checkValue) {
563
+ return false ;
564
+ }
565
+ }
566
+ return isEqual (x.lower (), y.lower ()) && isEqual (x.upper (), y.upper ()) &&
567
+ isEqual (x.stride (), y.stride ());
568
+ }
569
+ template <typename A>
548
570
static bool isEqual (const Fortran::evaluate::ArrayConstructor<A> &x,
549
571
const Fortran::evaluate::ArrayConstructor<A> &y) {
550
- llvm::report_fatal_error (" not implemented" );
572
+ for (const auto &[xValue, yValue] : llvm::zip (x, y)) {
573
+ using Expr = Fortran::evaluate::Expr<A>;
574
+ using ImpliedDo = Fortran::evaluate::ImpliedDo<A>;
575
+ bool checkElement = Fortran::common::visit (
576
+ common::visitors{
577
+ [&](const Expr &v, const Expr &w) { return isEqual (v, w); },
578
+ [&](const ImpliedDo &v, const ImpliedDo &w) {
579
+ return isEqual (v, w);
580
+ },
581
+ [&](const auto &, const auto &) {
582
+ llvm::report_fatal_error (" isEqual is not handled yet for "
583
+ " the element type in ImpliedDo" );
584
+ return false ;
585
+ },
586
+ },
587
+ xValue.u , yValue.u );
588
+ if (!checkElement) {
589
+ return false ;
590
+ }
591
+ }
592
+ return x.GetType () == y.GetType ();
551
593
}
552
594
static bool isEqual (const Fortran::evaluate::ImpliedDoIndex &x,
553
595
const Fortran::evaluate::ImpliedDoIndex &y) {
0 commit comments