shithub: scc

Download patch

ref: 080e69990174ad65f1611d8169a6b1f0f03414ea
parent: 285d54fa5709638cd975b5fcfc6a54bed54b9abc
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Fri Aug 14 14:13:50 EDT 2015

Fix cast()

Cast() is a problematic function because we need see two tokens
of the input, but the second token can be a typename, so we can
not use ahead() because it only can return the next character
of the input. The solution is to duplicate the rules.
When cast() sees a '(' it means that can be a cast, or can be a
parentheses expression, so it accepts the '(' and calls expr(),
but due to the lost of recursivity the actions of postfix were
not applied, so the solution is to call a modified version of
postfix() before returning.

--- a/cc1/expr.c
+++ b/cc1/expr.c
@@ -779,11 +779,12 @@
 }
 
 static Node *
-postfix(void)
+postfix(Node *lp)
 {
-	Node *lp, *rp;
+	Node *rp;
 
-	lp = primary();
+	if (!lp)
+		lp = primary();
 	for (;;) {
 		switch (yytoken) {
 		case '[':
@@ -869,7 +870,7 @@
 	case '~': op = OCPL;  fun = integeruop;   break;
 	case '&': op = OADDR; fun = address;      break;
 	case '*': op = OPTR;  fun = content;      break;
-	default:  return postfix();
+	default:  return postfix(NULL);
 	}
 
 	next();
@@ -906,6 +907,7 @@
 	default:
 		rp = expr();
 		expect(')');
+		rp = postfix(rp);
 		break;
 	}