Quoth adr <a...@sdf.org>: > On Wed, 20 Apr 2022, o...@eigenstate.org 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