www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - floating-point array size accepted by dmd 0.128

reply zwang <nehzgnaw gmail.com> writes:
void main(){
     int[0.128] a; // should not compile
}
Aug 04 2005
parent reply =?ISO-8859-1?Q?Thomas_K=FChne?= <thomas-dloop kuehne.THISISSPAM.cn> writes:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

zwang schrieb:

 void main(){
     int[0.128] a; // should not compile
 }
Added to DStress as http://dstress.kuehne.cn/nocompile/o/opIndex_05.d Thomas -----BEGIN PGP SIGNATURE----- iD8DBQFC9LPj3w+/yD4P9tIRAkdOAJsGrGqjvvdj6w3EUBfBRFAVnrq7SACfbPxu tEO9MvFFapIq291Z29Lro+c= =XpLM -----END PGP SIGNATURE-----
Aug 06 2005
parent braddr puremagic.com writes:
In article <dd2i4g$1k0g$2 digitaldaemon.com>, =?ISO-8859-1?Q?Thomas_K=FChne?=
says...
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

zwang schrieb:

 void main(){
     int[0.128] a; // should not compile
 }
Added to DStress as http://dstress.kuehne.cn/nocompile/o/opIndex_05.d Thomas -----BEGIN PGP SIGNATURE----- iD8DBQFC9LPj3w+/yD4P9tIRAkdOAJsGrGqjvvdj6w3EUBfBRFAVnrq7SACfbPxu tEO9MvFFapIq291Z29Lro+c= =XpLM -----END PGP SIGNATURE-----
Reviving a very old bug.. In the process of updating gdc, I ran across this one due to it now causing a segv during a late phase of compilation. I should probably find the root cause, but fixing the semantics phase so that this isn't allowed would also fix it. The problem is here in dmd/mtype.c: 1622 dim = dim->semantic(sc); 1623 dim = dim->constFold(); 1624 integer_t d1 = dim->toInteger(); 1625 dim = dim->castTo(tsize_t); 1626 dim = dim->constFold(); 1627 integer_t d2 = dim->toInteger(); 1628 1629 if (d1 != d2) 1630 goto Loverflow; The dim(ension) of the static array is cast to an int and used. So, any float gets truncated and used. Two issues: 1) add between 1623 and 1624: dim = dim->checkIntegral(); That will result in an error like: nocompile/o/opIndex_05.d:15: '1.12799999999999999995402982788661461199808400124e+0' is not of integral type, it is a double 2) that still doesn't fix the full bug, since what's also going on here is that int[0] a is being allowed as well. I didn't see anything in the language spec that indicated this should be allowed and if so what the semantics are. I tried the obvious fix, adding a d2 != 0 check, but that breaks norun/a/assert_10_A.d (amongst others) where it passes a literal "" through a char[] parameter, since it's a 0 length static array of chars. More thinking required for part 2, and at 3am, I can't think. :) Later, Brad
Mar 03 2006