ref: 440d87f85823350dedd0accaa9c90f425436064d
parent: eccbd1ecccca36d7c624ded19e78fa3254cf5600
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat May 31 10:08:29 EDT 2025
cc: OLABEL and OCASE nodes do not chain on Node.right (fixes case range warning) The code appers to have had some unused feature where OLABEL and OCASE nodes where threated like OLIST/OCOMMA where after generation it would chain on the Node.right pointer to the next one. Hoever, this appears to be unused. And when compiling OCASE nodes with a range then Node.right points to the end-range constant, which we should not compile (it left a value not used error).
--- a/sys/src/cmd/cc/pgen.c
+++ b/sys/src/cmd/cc/pgen.c
@@ -190,8 +190,6 @@
case OLIST:
case OCOMMA:
gen(n->left);
-
- rloop:
n = n->right;
goto loop;
@@ -253,7 +251,7 @@
}
gbranch(OGOTO); /* prevent self reference in reg */
patch(p, pc);
- goto rloop;
+ break;
case OGOTO:
canreach = 0;
@@ -289,24 +287,24 @@
cases->def = 1;
cases->label = pc;
cases->isv = 0;
- goto rloop;
+ break;
}
complex(l);
if(l->type == T)
- goto rloop;
+ break;
if(l->op != OCONST || !typeswitch[l->type->etype]) {
diag(n, "case expression must be integer constant");
- goto rloop;
+ break;
}
if(r != Z){
complex(r);
if(r->op != OCONST || !typeswitch[r->type->etype]) {
diag(n, "case expression must be integer constant");
- goto rloop;
+ break;
}
if(r->vconst < l->vconst){
diag(n, "case range must be increasing");
- goto rloop;
+ break;
}
end = r->vconst;
} else
@@ -319,7 +317,7 @@
cases->label = pc;
cases->isv = typev[l->type->etype];
}
- goto rloop;
+ break;
case OSWITCH:
l = n->left;
--- a/sys/src/cmd/cc/sub.c
+++ b/sys/src/cmd/cc/sub.c
@@ -2067,7 +2067,7 @@
case OCASE:
if(!caseok)
return 0;
- goto rloop;
+ break;
case OSWITCH:
return deadhead(n->right, 1);
--
⑨