diff --git a/include/minizinc/flatten_internal.hh b/include/minizinc/flatten_internal.hh index 65e262c14..cbc6a9792 100644 --- a/include/minizinc/flatten_internal.hh +++ b/include/minizinc/flatten_internal.hh @@ -590,12 +590,17 @@ public: std::vector& x; CmpExpIdx(std::vector& x0) : x(x0) {} bool operator()(int i, int j) const { - if (Expression::equal(x[i](), x[j]())) { - return false; - } - if (Expression::isa(x[i]()) && Expression::isa(x[j]()) && - Expression::cast(x[i]())->idn() != -1 && Expression::cast(x[j]())->idn() != -1) { - return Expression::cast(x[i]())->idn() < Expression::cast(x[j]())->idn(); + const long long int i_idn = + Expression::isa(x[i]()) ? Expression::cast(x[i]())->idn() : -1; + const long long int j_idn = + Expression::isa(x[j]()) ? Expression::cast(x[j]())->idn() : -1; + const bool i_is_valid_id = i_idn != -1; + const bool j_is_valid_id = j_idn != -1; + if (i_is_valid_id != j_is_valid_id) { + return i_is_valid_id > j_is_valid_id; + } + if (i_is_valid_id && j_is_valid_id) { + return i_idn < j_idn; } return x[i]() < x[j](); }