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