the following program gives a
"useless or misleading comparison: UINT < 0".

#include <u.h>
#include <libc.h>

uint r[]; // <-- unsigned array

void
main(int argc, char *argv[])
{
        int r;  // <--- signed

        r = 0;
        if(r < 0){
                exits(0);
        }
}

term% 6c -TVFwy /tmp/a.c
....
decl "r": C=GLOBL [B=0:O=0] T=ARRAY[0] UINT
decl "a": C=GLOBL [B=0:O=0] T=INT
decl "main": C=GLOBL [B=0:O=0] T=FUNC(INT, IND IND CHAR) VOID
decl "argc": C=PARAM [B=1:O=0] T=INT
decl "argv": C=PARAM [B=1:O=8] T=IND IND CHAR
decl "r": C=AUTO [B=1:O=-4] T=INT
revert1 "r"
revert1 "argv"
revert1 "argc"
 == strange ==
LT INT /tmp/a.c:13
   NAME "r" -4 <1> INT /tmp/a.c:13
   CONST "0" INT /tmp/a.c:13

all types seem fine here.

the reason is the following code in /sys/src/cmd/cc/com.c:^compar

        /*
         * Skip over left casts to find out the original expression range.
         */
        while(l->op == OCAST)
                l = l->left;
        if(l->op == OCONST)
                return 0;
        lt = l->type;
        if(l->op == ONAME && l->sym->type){
                lt = l->sym->type;                                              
// <------ here
                if(lt->etype == TARRAY)
                        lt = lt->link;
        }

note how we take the type from l->sym (which has been reverted).

why do we use the type from the sym instead of using the type
from the node?

--
cinap

Reply via email to