floating-point array size accepted by dmd 0.128

braddr at puremagic.com braddr at puremagic.com
Fri Mar 3 03:06:23 PST 2006


In article <dd2i4g$1k0g$2 at 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





More information about the Digitalmars-d-bugs mailing list