November 11, 2014
https://issues.dlang.org/show_bug.cgi?id=13710

          Issue ID: 13710
           Summary: Invariants not enforced on methods from alias this
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Windows
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: DMD
          Assignee: nobody@puremagic.com
          Reporter: markisaa@umich.edu

When you do "alias this" and have an invariant, any methods that are forwarded to the aliased member do not invoke your invariant methods.

This prevents me from writing a really sleek 10-liner to the tune of:

struct ValueRestrictedInteger(int lowerBound, int upperBound) {
  int value;
  alias value this;

  this (int rhs) { value = rhs; }

  invariant() {
    assert (value >= lowerBound && value <= upperBound);
  }

  void forDemonstrationOnly() {}
}

unittest {
  ValueRestrictedInteger!(0, 100) x = 0;
  x += 10;
  x -= 100; //This works, but I don't think it should
  x.forDemonstrationOnly(); //This causes the assertion to fire

  ValueRestrictedInteger!(0, 100) y = -100; //This also would hit
the assertion
}


Forum post on same topic: http://forum.dlang.org/thread/ijoqlxqlacccwmqnwpdn@forum.dlang.org

--