Operator overloading giving encrypted error messages.

2011-02-08 Thread Charles McAnany
Hi, all. I'm playing around with a BigRational struct to get more comfortable
with D.
The plan:
Allow binary operators so that a BR (BigRational) is the lhs and one of {BR,
BigInt, int, long} is the rhs.
So BR(5) + 2 compiles just as well as BR(5)+BR(2)
Here's the opBinary code I've worked out:
BigRational opBinary(string op,T)(T arg){
BigRational y = BigRational(arg);
static if(op == +){
BigRational temp = this;
}}} /// and so on, ending with an assert(0) after all the static ifs.

So, unit testing this with
auto br1 = BigRational(25,2);
writefln(br1+1 = %s,br1+1);
works beautifully.


Now, I'd like to define the ++ to increase this by 1.
So, I write:
BigRational opUnary(string op)(){
static if(op == ++){
this = this+1;
return this;
//There are other overloads, too.
}}
Now, when I unittest
writefln(br1++ = %s, br1++); //This is line 166.
I get a weird error message:
C:\DProjects\BigRational\srcdmd BigRational.d -unittest
BigRational.d(166): Error: template BigRational.BigRational.opBinary(string op,T
) does not match any function template declaration
BigRational.d(166): Error: template BigRational.BigRational.opBinary(string op,T
) cannot deduce template function from argument types !()()

My issue here is that I have already used the exact same syntax in the first
unit test as my code for the ++ overload has, but here it fails me. (Plus, why
is line 166 having trouble with opBinary? ++ is unary, no?
Any ideas?
Thanks,
Charles.
begin 644 BigRational.d
M:6UP;W)T('-T9YB:6=I;G0[#0II;7!OG0@W1D+G-TFEN9SL-FEM]R
M=!S=0NW1D:6\[#0II;7!OG0@W1D+FUA=@[#0HO+T$@9\M;F]T:EN
M9R!M86EN+!T;R!M86ME('1H92!C;VUP:6QEB!H87!P2X@5AEF4@:7,@
M82!W87D@=\@;6%K92!A(1L;!OB!S;VUE=AI;FL()U=!))VQL('-T
M:6-K('=I=@@86X@97AE+B`-B\O5\@8V]MEL92!A;F0@G5N('1EW1S
M+!D;60@0FEG4F%T:6]N86PN9`M=6YI='1EW0-G9O:60@;6%I;B@IPT*
M?0T*#0HO*BH-D$@0FEG4F%T:6]N86PN(%!EF9OFUS(%R8FETF%R2UP
MF5C:7-I;VX@87)I=AM971I8R!O;B!N=6UB97)S(`T*=VET:!N=6UEF%T
M;W)S(%N9!D96YO;6EN871OG,N(`T*075T:]R.B!#:%R;5S($UC06YA
M;GDN#0HJ+PT*W1R=6-T($)I9U)A=EO;F%LPT*')I=F%T93H-@E:6=)
M;G0@;G5M97)A=]R.PT*4)I9TEN=!D96YO;6EN871OCL-@D-@DO+R]#
M86QC=6QA=5S('1H92!G8V0@;V8@='=O($)I9TEN=',L('5S:6YG($5U8VQI
M9=S(%L9V]R:71H;2X-@E:6=);G0@9V-D*$)I9TEN=!I;G0Q+!:6=)
M;G0@:6YT,BE[#0H)6EF(AI;G0R(#T](#`I#0H)0ER971UFX@:6YT,3L-
M@D)F5T=7)N(=C9AI;G0R+EN=#$@)2!I;G0R*3L-@E]#0H-@DO+R]!
MW-U;65S('1H870@8F]T:!V86QU97,@87)E('!OVET:79E+@T*4)I9TEN
M=!L8VTH0FEG26YT(EN=#$L($)I9TEN=!I;G0R*7L-@D)F5T=7)N(EN
M=#$J:6YT,B]G8V0H:6YT,2QI;G0R*3L-@E]#0H)#0H)=F]I9!S:6UP;EF
M4UE*E[#0H)2\O1FERW0L(-H96-K(9OB!Z97)ORX@#0H)6EF(AD
M96YO;6EN871OB`]/2`P*7L-@D)71HF]W(YE=R!%-E'1I;VXH(D1I
M=FED92!B2!Z97)O(BD[#0H)7T-@D):68H;G5M97)A=]R(#T](#`IPT*
M0D);G5M97)A=]R(#U:6=);G0H,D[#0H)0ED96YO;6EN871OCT@0FEG
M26YT*#$I.PT*0E]0T*0DO+TEF('1H92!D96YO;6EN871OB!IR!N96=A
M=EV92P@9FQI!T:4@;F5G871I=F4N(`T*0EI9B`H95N;VUI;F%T;W(@
M/`P*7L-@D)61E;F]M:6YA=]R*CT@+3$[#0H)0EN=6UEF%T;W(J/2`M
M,3L)#0H)7T-@D)0FEG26YT(-O;6UO;D9A8W1OB`](=C9AN=6UEF%T
M;W(L95N;VUI;F%T;W(I.PT*0EN=6UEF%T;W(@+ST@8V]M;6]N1F%C=]R
M.PT*0ED96YO;6EN871OB`O/2!C;VUM;VY86-T;W([#0H)?0T*0T*'5B
M;EC.B`-@D-@T*71H:7,H5#$@/2!:6=2871I;VYA;P@5#(@/2!:6=2
M871I;VYA;DH0FEG4F%T:6]N86P@;G5M+!:6=2871I;VYA;!D96XIPT*
M0EA=71O(')ER`](YU;2]D96X[#0H)7-E=%5P4W1A=4HF5S+FYU;65R
M871OBQR97,N95N;VUI;F%T;W(I.PT*7T-@D-@D-@ET:ES*%0Q(#T@
M0FEG26YT+!4,B`]($)I9TEN=DH0FEG26YT(YU;2P@0FEG26YT(1E;BE[
M#0H)7-E=%5P4W1A=4H;G5M+1E;BD[#0H)?0T*0T*71H:7,H5#$@/2!S
M=')I;FL(%0R(#T@W1R:6YG*2AS=')I;F@;G5M+!S=')I;F@95N*7L-
M@D)V5T57!3=%T92A:6=);G0H;G5M*2Q:6=);G0H95N*2D[#0H)?0T*
M0T*71H:7,H5#$](QO;FL(%0R/6QO;FI*QO;F@;G5M+!L;VYG(1E
M;BE[#0H)7-E=%5P4W1A=4H0FEG26YT*YU;2DL0FEG26YT*1E;BDI.PT*
M7T-@D-@EV;VED('-E=%5P4W1A=4H0FEG26YT(YU;2P@0FEG26YT(1E
M;BE[#0H)71H:7,N;G5M97)A=]R(#T@;G5M.PT*0ET:ES+F1E;F]M:6YA
M=]R(#T@95N.PT*0ES:6UP;EF4UE*D[0D-@E]#0H)#0H)=AIRA4
M+$4I*%0@;G5M+!%(1E;BD-@EI9B@A:7,H5`]/2!%*2E[#0H)6%U=\@
M=AE3G5M(#T@0FEG4F%T:6]N86PH;G5M*3L-@D)875T;R!T:5$96X@/2!
M:6=2871I;VYA;AD96XI.PT*0EA=71O(')ER`]('1H94YU;2]T:5$96X[
M#0H)7-E=%5P4W1A=4HF5S+FYU;65R871OBQR97,N95N;VUI;F%T;W(I
M.PT*7T-@D-@ET:ES*%0@/2!:6=2871I;VYA;DH0FEG4F%T:6]N86P@
MW1AG0IPT*0ES9715%-T871E*'-T87)T+FYU;65R871OBP@W1AG0N
M95N;VUI;F%T;W(I.PT*7T-@D-@D-@ET:ES*%0I*%0@;G5M*0T*6EF
M*%IRA4(#T]($)I9U)A=EO;F%L*2E[#0H)4)I9TEN=!T:5.=6T[#0H)
M7-T871I8R!I9B`H(6ES*%0@/3T@0FEG26YT*2E[#0H)0ET:5.=6T@/2!
M:6=);G0H;G5M*3L-@D)?65LV5[#0H)0ET:5.=6T@/6YU;3L-@D)?0T*
M0ES9715%-T871E*'1H94YU;2Q:6=);G0H,2DI.PT*7T-@D-@DO+U-T
MF5SR!T:4@8V]NW1R=6-T;W)S+B`-@EU;FET=5S='L-@D)0FEG4F%T
M:6]N86P@8G(Q(#T@0FEG4F%T:6]N86PH(C$R,S0B+(R-2(I.PT*0E:6=2
M871I;VYA;!BC(@/2!:6=2871I;VYA;A:6=);G0H,C,T-2DI.PT*0EA
MW-EG0H8G(R(#T](#(S-#4I.PT*0E:6=2871I;VYA;!BC,@/2!:6=2
M871I;VYA;@B,3(S-#4V-S@Y,#DX-S8U-#,R,3(S-#4V-S@Y.#V-30S,C,T
M-38W.#V-30S,C,T-38W.#V-30S(BPB,C,T-38W-C4T,S(S-#4V-30S-#4V
M-30S,C,T-38W.#V-30S(BD[#0H)4)I9U)A=EO;F%L()R-`]($)I9U)A
M=EO;F%L*)R,2Q:6=);G0H,C`P,DI.PT*0E:6=2871I;VYA;!BC4@
M/2!:6=2871I;VYA;ABC$L8G(R*3L-@D)875T;R!BC8@/2!:6=2871I

Re: Operator overloading giving encrypted error messages.

2011-02-08 Thread bearophile
 It sees the post-increment fires the opBinary template too. I think this is a 
 front-end bug, for Bugzilla if confirmed and not already present.

http://d.puremagic.com/issues/show_bug.cgi?id=5551