shithub: scc

Download patch

ref: 94615c26e61ff331100b39816cf2b4ea82dc4bd7
parent: cdafe864ddbdca6af43660f88bff661afb6b42de
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Wed Apr 16 07:48:40 EDT 2014

Add void pointers

These pointers can be mixed with pointers of any type.

--- a/cc.h
+++ b/cc.h
@@ -113,7 +113,7 @@
 
 extern Type *typename(void);
 
-extern Type *voidtype, *booltype,
+extern Type *voidtype, *pvoidtype, *booltype,
 	*uchartype,   *chartype,
 	*uinttype,    *inttype,
 	*ushortype,   *shortype,
--- a/expr.c
+++ b/expr.c
@@ -117,6 +117,9 @@
 		switch (t2) {
 		case ARY: case FTN:
 			np = addr2ptr(np);
+		case PTR:
+			if (tp1 != pvoidtype && tp2 != pvoidtype)
+				return NULL;
 			/* TODO:
 			 * we assume conversion between pointers
 			 * do not need any operation, but due to
--- a/types.c
+++ b/types.c
@@ -13,6 +13,10 @@
 		.op = VOID,
 		.letter = 'W'
 	},
+	*pvoidtype = &(Type) {
+		.op = PTR,
+		.letter = 'R'
+	},
 	*booltype = &(Type) {
 		.op = INT,
 		.letter = 'B',
@@ -139,6 +143,8 @@
 	register Type *bp;
 	char letter;
 
+	if (op == PTR && tp == voidtype)
+		return pvoidtype;
 	t = (op  ^  (uint8_t) ((unsigned short) tp >> 3))
 	         & NR_TYPE_HASH-1;
 	tbl = &typetab[t];
--