Re: [9fans] Conversion of constants in C compiler

2022-05-10 Thread adr

Arrrg!

[...]
   vv = yylval.vval;
   if(c1 & Numvlong ||
 (uvlong)convvtox(vv, TUVLONG) > convvtox(vv, TULONG)){
   /* unsigned suffix or hex occupying the sing bit */
   if((c1 & Numuns) || convvtox(vv, TVLONG) < 0 && (c1 & Numdec) == 
0) {
   c = LUVLCONST;
   t = TUVLONG;
   goto nret;
   }
   c = LVLCONST;
   t = TVLONG;
   goto nret;
   }
   if(c1 & Numlong ||
 (uvlong)convvtox(vv, TULONG) > convvtox(vv, TUINT)){
   if((c1 & Numuns) || convvtox(vv, TLONG) < 0 && (c1 & Numdec) == 
0) {
   c = LULCONST;
   t = TULONG;
   goto nret;
   }
   /* decimal occupying the sing bit */
   if(convvtox(vv, TLONG) < 0 && (c1 & Numdec)) {
   c = LVLCONST;
   t = TVLONG;
   goto nret;
   }
   c = LLCONST;
   t = TLONG;
   goto nret;
   }
   if((c1 & Numuns) || convvtox(vv, TINT) < 0 && (c1 & Numdec) == 0) {
   c = LUCONST;
   t = TUINT;
   goto nret;
   }
   if(convvtox(vv, TINT) < 0 && (c1 & Numdec)) {
   c = LLCONST;
   t = TLONG;
   goto nret;
   }
   c = LCONST;
   t = TINT;
   goto nret;
[...]

--
9fans: 9fans
Permalink: 
https://9fans.topicbox.com/groups/9fans/T22754f10b241991c-M489f3936d41217db381e8d09
Delivery options: https://9fans.topicbox.com/groups/9fans/subscription


Re: [9fans] Conversion of constants in C compiler

2022-05-10 Thread adr

I think I got it right at last:

[...]
   vv = yylval.vval;
   if(c1 & Numvlong ||
 (uvlong)convvtox(vv, TUVLONG) > convvtox(vv, TULONG)){
   /* unsigned suffix or hex occupying the sing bit */
   if((c1 & Numuns) || convvtox(vv, TVLONG) < 0 && (c1 & Numdec) == 
0) {
   c = LUVLCONST;
   t = TUVLONG;
   goto nret;
   }
   c = LVLCONST;
   t = TVLONG;
   goto nret;
   }
   if(c1 & Numlong ||
 (uvlong)convvtox(vv, TULONG) > convvtox(vv, TUINT)){
   if((c1 & Numuns) || convvtox(vv, TLONG) < 0 && (c1 & Numdec) == 
0) {
   c = LULCONST;
   t = TULONG;
   goto nret;
   }
   /* decimal occupying the sing bit */
   if(convvtox(vv, TLONG) < 0 && (c1 & Numdec) == 0) {
   c = LVLCONST;
   t = TVLONG;
   goto nret;
   }
   c = LLCONST;
   t = TLONG;
   goto nret;
   }
   if((c1 & Numuns) || convvtox(vv, TINT) < 0 && (c1 & Numdec) == 0) {
   c = LUCONST;
   t = TUINT;
   goto nret;
   }
   if(convvtox(vv, TINT) < 0 && (c1 & Numdec) == 0) {
   c = LLCONST;
   t = TLONG;
   goto nret;
   }
   c = LCONST;
   t = TINT;
   goto nret;
[...]

I used the cast also in (uvlong)convvtox(vv, TULONG) because the
standard only specifies that long long can't be smaller than long.

After playing with this I'm thinking about using the original code
and substituting the warning for an error when a constant is
truncated. Makes sense to me and Plan9's C isn't C99 anyway.

adr.

--
9fans: 9fans
Permalink: 
https://9fans.topicbox.com/groups/9fans/T22754f10b241991c-M1f19d8edddfa4ec4ae0f5901
Delivery options: https://9fans.topicbox.com/groups/9fans/subscription