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];
--
⑨