shithub: scc

Download patch

ref: 5b666be8a5986e9d7f82d7877b9678429bfb3d55
parent: bab40c3565755c5caadec881f259947dd0dbafa2
author: Roberto E. Vargas Caballero <[email protected]>
date: Fri Sep 25 18:36:35 EDT 2015

Add support for k&r empty functions

Functions without any parameter in a prototype are k&r
functions, or with other words, they are varargs functions.

--- a/cc1/decl.c
+++ b/cc1/decl.c
@@ -189,17 +189,20 @@
 static void
 fundcl(struct declarators *dp)
 {
-	Type type = {.n = {.elem = -1}, .p = {.pars= NULL}};
-	Symbol *syms[NR_FUNPARAM], **sp;
+	Type type;
+	Symbol *syms[NR_FUNPARAM], **sp = syms;
 	TINT size;
 	Symbol *pars = NULL;
 
 	pushctx();
 	expect('(');
+	type.n.elem = 0;
+	type.p.pars = NULL;
 
-	if (!accept(')')) {
-		type.n.elem = 0;
-		sp = syms;
+	if (accept(')')) {
+		newpar(&type, ellipsistype);
+		*sp++ = NULL;
+	} else {
 		do {
 			if (!accept(ELLIPSIS)) {
 				*sp++ = dodcl(0, parameter, NS_IDEN, &type);
@@ -211,11 +214,10 @@
 		} while (accept(','));
 
 		expect(')');
-
-		if (type.n.elem != -1) {
-			size = type.n.elem * sizeof(Symbol *);
-			pars = memcpy(xmalloc(size), syms, size);
-		}
+	}
+	if (type.n.elem != -1) {
+		size = type.n.elem * sizeof(Symbol *);
+		pars = memcpy(xmalloc(size), syms, size);
 	}
 	push(dp, FTN, type.n.elem, type.p.pars, pars);
 }
--- a/cc1/tests/test004.c
+++ b/cc1/tests/test004.c
@@ -2,7 +2,7 @@
 name: TEST004
 description: Test integer operations
 output:
-F1
+F1	E
 G2	F1	main
 {
 \
--- a/cc1/tests/test005.c
+++ b/cc1/tests/test005.c
@@ -2,7 +2,7 @@
 name: TEST005
 description: Test unary integer operations
 output:
-F1
+F1	E
 G2	F1	main
 {
 \
--- a/cc1/tests/test006.c
+++ b/cc1/tests/test006.c
@@ -6,7 +6,7 @@
 test006.c:8: warning: conditional expression is constant
 test006.c:11: warning: conditional expression is constant
 G1	K	c
-F2
+F2	E
 G3	F2	main
 {
 \
--- a/cc1/tests/test007.c
+++ b/cc1/tests/test007.c
@@ -2,7 +2,7 @@
 name: TEST007
 description: basic while test
 output:
-F1
+F1	E
 G2	F1	main
 {
 \
--- a/cc1/tests/test008.c
+++ b/cc1/tests/test008.c
@@ -2,7 +2,7 @@
 name: TEST008
 description: Basic do while loop
 output:
-F1
+F1	E
 G2	F1	main
 {
 \
--- a/cc1/tests/test009.c
+++ b/cc1/tests/test009.c
@@ -2,7 +2,7 @@
 name: TEST009
 description: Basic test for loops
 output:
-F1
+F1	E
 G2	F1	main
 {
 \
--- a/cc1/tests/test010.c
+++ b/cc1/tests/test010.c
@@ -5,7 +5,7 @@
 test010.c:9: warning: conditional expression is constant
 test010.c:11: warning: conditional expression is constant
 test010.c:31: warning: conditional expression is constant
-F1
+F1	E
 G2	F1	main
 {
 \
--- a/cc1/tests/test011.c
+++ b/cc1/tests/test011.c
@@ -4,7 +4,7 @@
 output:
 test011.c:14: warning: 'foo' defined but not used
 test011.c:14: warning: 'start' defined but not used
-F1
+F1	E
 G2	F1	main
 {
 \
--- a/cc1/tests/test012.c
+++ b/cc1/tests/test012.c
@@ -3,7 +3,7 @@
 description: Basic switch test
 output:
 test012.c:39: warning: 'foo' defined but not used
-F1
+F1	E
 G2	F1	main
 {
 \
--- a/cc1/tests/test017.c
+++ b/cc1/tests/test017.c
@@ -2,7 +2,7 @@
 name: TEST017
 description: Basic test about pointers and structs
 output:
-F9
+F9	E
 G10	F9	main
 {
 \
--- a/cc1/tests/test018.c
+++ b/cc1/tests/test018.c
@@ -2,7 +2,7 @@
 name: TEST018
 description: Basic test for arrays
 output:
-F1
+F1	E
 G2	F1	main
 {
 \