shithub: front

Download patch

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);
--