Chris:

I had a stupid bug:

class Base {
  SomeStruct someStruct;
  // ...
}

class BaseSub {
  // ...
  override {
    public void doThis() {
auto someStruct = checkSomething("input"); // Bug is here, of course, // a leftover from old code
    }
  }

  private void doSomethingElse() {
    if (someStruct.hasValue) {
auto val = someStruct.value; // Segmentation fault (core dumped)
       // ...
    }
  }

  private auto someCheck(string input) {
    return SomeStruct(input);
  }
}

dmd 2.63

SomeStruct is declared outside the class.

It compiled and dmd didn't say anything about "local variable declaration someStruct is hiding class variable someStruct."


If I understand correctly, you are suggesting to generate a warning here:


class Foo {
    int x;
    void bar() {
        auto x = 1; // ?
    }
    void spam(int x) { // ?
    }
}
void main() {}


Currently D doesn't give an error or warning if in a method you declare a local variable with the same name of a instance member. This is indeed a source of bugs and I have had similar problems. Generally D prefers to minimize the number of warnings, so according to the D style that should become an error.

I presume D is designed this way for compatibility with Java code. But I don't like much this part of the D design. In other cases (with for/foreach loops, the with statement) D has chosen to break the C++ way and introduce a variable shadowing error.

Bye,
bearophile

Reply via email to