[Issue 4595] [tdpl] Accessing non-static member of a null reference compiles
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Thu Sep 19 00:34:01 PDT 2013
http://d.puremagic.com/issues/show_bug.cgi?id=4595
--- Comment #14 from Kenji Hara <k.hara.pg at gmail.com> 2013-09-19 00:33:55 PDT ---
(In reply to comment #13)
> After a few years of D use, I actually find the above will create problems. We
> often use traits like these to check whether something is compilable, even if
> the object is left uninitialized.
Today, code flow analysis for class ctor call (super(...) and this(...))
behaves as follows.
class Foo
{
this(int) {}
}
class Bar : Foo
{
this()
{
static assert(is(typeof(super(0))));
static if (is(typeof(super(0)))) {}
// inside typeof(), code flow analysis never works.
super(1);
// OK
static assert(is(typeof(super(0))));
static if (is(typeof(super(0)))) {}
// also OK
super(2);
// Error: multiple constructor call
}
this(int)
{
static assert( __traits(compiles, super(1)));
// inside __traits(compiles), code flow analysis is enabled.
super(1);
// Error: multiple constructor call
static assert(!__traits(compiles, super(2)));
// The _second_ super call makes error.
super(3);
// Error: multiple constructor call
}
}
This is expected behavior, from my compiler-internal knowledge.
- `is(typeof(exp))` tests that the exp has valid type or not. For type
calculation, the code flow analysis and its validation result is just
unnecessary.
- `__traits(compiles, exp)` tests the exact validness of `exp` at there. In
other words, `__traits(compiles)` converts the error occurrence on the `exp`
semantic analysis to the compile-time boolean value. In there, code flow
analysis is enabled, and the errors will be counted normally.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list