New Issue: Support promotion over tuples

24682, "ShreyasKhandekar", "Support promotion over tuples", "2024-03-26T21:46:48Z"

From the subteam to discuss stabilizing tuple-scalar operations (see Are we committed to tuple-scalar operator overloads? · Issue #23317 · chapel-lang/chapel · GitHub) we decided to support tuple-scalar operations by default.
Currently we stabilized the operations that were marked unstable in Unstabilize tuple-scalar operators by vasslitvinov · Pull Request #23375 · chapel-lang/chapel · GitHub "as-is" with #24685

But the intention is to support promotion over homogeneous tuples in general and replace these operators which offer a sort of "special case" promotion for tuples.

We don't intend to support this for heterogeneous tuples because it can be hard to know how to characterize what kind of
scalar argument can be combined with a heterogeneous tuples.

Currently the tuple-scalar operations have the signatures as follows:

inline operator +(x: _tuple, y: x(0).type) where isHomogeneousTuple(x) 

and

inline operator +(x: ?t, y: _tuple) where isHomogeneousTuple(y) && isCoercible(t, (y(0).type)) 

When adding support for promotion, we want to make sure that the change is non-breaking.

We must keep the behavior of the promotion the same as the tuple scalar operations today. Since the behavior of currently supported operations (+, -, *, /, %, **, &, |, ^ , <<, and >>) is now stable, we must retain that.
But as promotion over tuples would return a tuple result, other operators like (1, 2, 3) == 1 could yield (true, false, false) for example, this can be tweaked how we want since it would be a new feature and thus non-breaking.