Quoth adr <[email protected]>:
> On Wed, 20 Apr 2022, [email protected] wrote:
> > When you have a patch, let me know -- I'll happily test
> > and apply to 9front.
>
> Hi ori, this patch applyes to the sources served at 9front.org.
> By the way, do you plan to keep in sync
> http://only9fans.com/ori/git9/HEAD/info.html or should I forget
> about that repo?
>
> Regards,
> adr.
>
> --- /n/9front/sys/src/cmd/cc/lex.c Wed Apr 6 14:45:26 2022
> +++ /tmp/lex.c Thu Apr 21 08:39:14 2022
> @@ -848,16 +848,9 @@
> yyerror("overflow in constant");
>
> vv = yylval.vval;
> - /*
> - * c99 is silly: decimal constants stay signed,
> - * hex and octal go unsigned before widening.
> - */
> - w = 32;
> - if((c1 & (Numdec|Numuns)) == Numdec)
> - w = 31;
> - if(c1 & Numvlong || (c1 & Numlong) == 0 && (uvlong)vv >= 1ULL<<w){
> - if((c1&(Numdec|Numvlong)) == Numdec && vv < 1ULL<<32)
> - warn(Z, "int constant widened to vlong: %s", symb);
> + if(c1 & Numvlong ||
> + convvtox(vv, TUVLONG) > convvtox(vv, TULONG) ||
> + (c1 & (Numdec|Numuns)) == Numdec && convvtox(vv, TLONG) < 0) {
> if((c1 & Numuns) || convvtox(vv, TVLONG) < 0) {
> c = LUVLCONST;
> t = TUVLONG;
Thanks for the patch!
I think this gets the condition slightly wrong. For a decimal
number, we should promote:
int -> long -> vlong.
For a hex number, though, we want
int -> uint -> long -> ulong -> vlong -> uvlong
however with the condition above,
18446744073709551615
will get converted to a uvlong:
c1 & Numvlong == 0:
false -> no explicit conversion
convvtox(vv, TUVLONG) > convvtox(vv, TULONG)
true -> vv fits into a uvlong, but not a ulong,
so we enter this.
so then, we end up in this branch:
if((c1 & Numuns) || convvtox(vv, TVLONG) < 0) {
true, because convvtox(vv, TVLONG) < 0.
I think we want:
if(c1 & Numvlong ||
convvtox(vv, TUVLONG) != convvtox(vv, TULONG) ||
convvtox(vv, TLONG) < 0) {
if((c1 & (Numdec|Numuns)) == 0 &&
((c1 & Numuns) || convvtox(vv, TVLONG) < 0)) {
c = LUVLCONST;
t = TUVLONG;
goto nret;
}
c = LVLCONST;
t = TVLONG;
goto nret;
}
if(c1 & Numlong ||
convvtox(vv, TULONG) > convvtox(vv, TUINT) ||
convvtox(vv, TINT) < 0) {
if((c1 & (Numdec|Numuns)) == 0 &&
((c1 & Numuns) || convvtox(vv, TLONG) < 0)) {
c = LULCONST;
t = TULONG;
goto nret;
}
c = LLCONST;
t = TLONG;
goto nret;
}
------------------------------------------
9fans: 9fans
Permalink:
https://9fans.topicbox.com/groups/9fans/T22754f10b241991c-M4a92d1c5d54d32d3f8221d1e
Delivery options: https://9fans.topicbox.com/groups/9fans/subscription