New Issue: When should shadowing occur for operator functions and methods?

20540, "mppf", "When should shadowing occur for operator functions and methods?", "2022-08-29T17:57:59Z"

Summary of Problem

Before PR #20528, operators had the following shadowing behavior:

  • if an operator method shadows an operator method, ambiguity
  • if a non-method operator shadows an operator method, ambiguity
  • if an operator method shadows an non-method operator, ambiguity
  • if an non-method operator shadows an non-method operator, the inner one is chosen

After PR #20528, that behavior changes to choosing the inner one in all of the above cases.

Which behavior is the behavior we want?

Steps to Reproduce

Source Code:

module Library {

  record R { var x: int; }

  operator +(a: R, b: R) { 
    writeln("in Library plus");
    return new R(a.x + b.x);
  }
}

module Variant {
  import Library.R;

  operator R.+(a: R, b: R) {
    writeln("in Variant plus");
    return new R(a.x + b.x);
  }
}

module Main {
  use Library;

  proc main() {
    use Variant;

    var x = new R(1);
    var y = new R(2);
    var z = x + y;

    assert(z.x == 3);
  }
}

Associated ~Future~ Test(s):
test/functions/operatorOverloads/shadowing-* #20528