On Friday, 10 October 2014 at 22:05:18 UTC, Timon Gehr wrote:
On 10/10/2014 07:09 PM, IgorStepanov wrote:
I've created DIP for my pull request.
DIP: http://wiki.dlang.org/DIP66
PR: https://github.com/D-Programming-Language/dmd/pull/3998
Please, comment it.
- "C c;
int i = c; //Error: c.a.i vs c.b.i
static assert(is(C : int)); //Ok, because C is subtype of int
anyway."
So now we can have 'subtypes' whose instances cannot be stored
in variables of the 'base type'?
C++ allowed subtypes, which can not be casted to the base type
(inheritance of two identical, non-virtual base classes).
Ok, I've wrote my position, understood your and wait the decision
of the arbitrator:)
Such behaviour is inconsistent with both the reference
implementation and the documentation (and the two happen to be
mutually inconsistent on how 'is(:)' should behave as well. :o)
)
- "The following pseudo-code illustrates this: [...] Finally,
if resultSet contains only one candidate, the compiler will
accept it."
This process might very well never terminate but it could
terminate in more cases if it did something better than the
naive brute-force search. I.e. either report cycles or don't
keep exploring around cycles, but just looping indefinitely on
cycles like the following is IMO not a good course of action:
struct S{
alias get this;
T get(){ return T.init; }
}
struct T{
alias get this;
S get(){ return S.init; }
int x;
alias x this;
}
void main(){
S s;
int x=s;
}
This case described in DIP below.
Recursion tree will be like:
s.get
s.get.get ->return, because T is already visited
s.x -> win
Furthermore, the following code compiles now, but doesn't under
the approach described in the DIP. Is this an actual regression
your pull introduces or is there a bug in the pseudocode?:
class A{
alias x this;
int x;
}
class B: A{
alias y this;
int y;
}
void main(){
int x = new B();
}
The same issue also needs to be considered if A and B are
structs instead and B has an additional alias this to an A (the
solution might also be part of a fix for the cycle issue).
- "If resultSet contains more then one candidates, the compiler
raises an error."
struct A
{
short s;
alias s this;
}
struct B
{
int i;
alias i this;
}
struct C
{
A a;
B b;
alias a this;
alias b this;
}
long l = C(); //What do you suggest?