From 3671902d06657c650ed74a2bdc918f1d6dc171e2 Mon Sep 17 00:00:00 2001
From: Spoike <acceptthis@users.sourceforge.net>
Date: Sun, 15 Apr 2007 17:35:58 +0000
Subject: [PATCH] Added a warning for void() functionname() {} functions. Fixed
 the ent.field.field += bug; by swapping the order of statements.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@2495 fc73d0e0-1445-4013-8a0c-d673dee63da5
---
 engine/qclib/qcc.h         |  3 ++-
 engine/qclib/qcc_pr_comp.c | 24 +++++++++++++++++++-----
 engine/qclib/qcc_pr_lex.c  |  6 ++++++
 3 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/engine/qclib/qcc.h b/engine/qclib/qcc.h
index dbdefd6e0..8f9cbbe5c 100644
--- a/engine/qclib/qcc.h
+++ b/engine/qclib/qcc.h
@@ -530,7 +530,7 @@ void QCC_PR_Lex (void);
 // reads the next token into pr_token and classifies its type
 
 QCC_type_t *QCC_PR_NewType (char *name, int basictype);
-QCC_type_t *QCC_PR_ParseType (int newtype);
+QCC_type_t *QCC_PR_ParseType (int newtype); extern pbool type_inlinefunction;
 QCC_type_t *QCC_TypeForName(char *name);
 QCC_type_t *QCC_PR_ParseFunctionType (int newtype, QCC_type_t *returntype);
 QCC_type_t *QCC_PR_ParseFunctionTypeReacc (int newtype, QCC_type_t *returntype);
@@ -607,6 +607,7 @@ enum {
 	WARN_UNDESIRABLECONVENTION,
 	WARN_SAMENAMEASGLOBAL,
 	WARN_CONSTANTCOMPARISON,
+	WARN_UNSAFEFUNCTIONRETURNTYPE,
 
 	ERR_PARSEERRORS,	//caused by qcc_pr_parseerror being called.
 
diff --git a/engine/qclib/qcc_pr_comp.c b/engine/qclib/qcc_pr_comp.c
index 61f8a5a38..7b9fcc63f 100644
--- a/engine/qclib/qcc_pr_comp.c
+++ b/engine/qclib/qcc_pr_comp.c
@@ -1583,17 +1583,23 @@ QCC_def_t *QCC_PR_Statement ( QCC_opcode_t *op, QCC_def_t *var_a, QCC_def_t *var
 							break;
 
 					if (statements[st].c == var_b->ofs)
-						QCC_PR_ParseWarning(0, "Temp-reuse may have broken your %s\n", pr_opcodes);
+						QCC_PR_ParseWarning(0, "Temp-reuse may have broken your %s", op->name);
 				}
 				if (st < 0)
-					QCC_PR_ParseError(ERR_INTERNAL, "XSTOREP_F couldn't find pointer generation");
+					QCC_PR_ParseError(ERR_INTERNAL, "XSTOREP_F: pointer was not generated from previous statement");
 				var_c = QCC_GetTemp(*op->type_c);
 
-				statement_linenums[statement-statements] = pr_source_line;
-				statement->op = OP_LOAD_F;
+				statement_linenums[statement-statements] = statement_linenums[st];
+				statement->op = OP_ADDRESS;
 				statement->a = statements[st].a;
 				statement->b = statements[st].b;
-				statement->c = var_c->ofs;
+				statement->c = statements[st].c;
+
+				statement_linenums[st] = pr_source_line;
+				statements[st].op = OP_LOAD_F;
+				statements[st].a = statements[st].a;
+				statements[st].b = statements[st].b;
+				statements[st].c = var_c->ofs;
 			}
 
 			statement = &statements[numstatements];
@@ -7388,6 +7394,7 @@ void QCC_PR_ParseDefs (char *classname)
 	pbool noref = false;
 	pbool nosave = false;
 	pbool allocatenew = true;
+	pbool inlinefunction = false;
 	int ispointer;
 	gofs_t oldglobals;
 	int arraysize;
@@ -7669,6 +7676,8 @@ void QCC_PR_ParseDefs (char *classname)
 	if (type == NULL)	//ignore
 		return;
 
+	inlinefunction = type_inlinefunction;
+
 	if (externfnc && type->type != ev_function)
 	{
 		printf ("Only functions may be defined as external (yet)\n");
@@ -7866,7 +7875,12 @@ void QCC_PR_ParseDefs (char *classname)
 			arraysize = 1;
 
 		if (QCC_PR_CheckToken("("))
+		{
+			if (inlinefunction)
+				QCC_PR_ParseWarning(WARN_UNSAFEFUNCTIONRETURNTYPE, "Function returning function. Is this what you meant? (suggestion: use typedefs)");
+			inlinefunction = false;
 			type = QCC_PR_ParseFunctionType(false, type);
+		}
 
 		if (classname)
 		{
diff --git a/engine/qclib/qcc_pr_lex.c b/engine/qclib/qcc_pr_lex.c
index 6ecdfec08..e755cc506 100644
--- a/engine/qclib/qcc_pr_lex.c
+++ b/engine/qclib/qcc_pr_lex.c
@@ -2988,6 +2988,7 @@ QCC_type_t *QCC_PR_FieldType (QCC_type_t *pointsto)
 	return QCC_PR_FindType (ptype);
 }
 
+pbool type_inlinefunction;
 QCC_type_t *QCC_PR_ParseType (int newtype)
 {
 	QCC_type_t	*newparm;
@@ -2996,6 +2997,8 @@ QCC_type_t *QCC_PR_ParseType (int newtype)
 	char	*name;
 	int i;
 
+	type_inlinefunction = false;	//doesn't really matter so long as its not from an inline function type
+
 //	int ofs;
 
 	if (QCC_PR_CheckToken (".."))	//so we don't end up with the user specifying '. .vector blah' (hexen2 added the .. token for array ranges)
@@ -3259,7 +3262,10 @@ QCC_type_t *QCC_PR_ParseType (int newtype)
 	QCC_PR_Lex ();
 	
 	if (QCC_PR_CheckToken ("("))	//this is followed by parameters. Must be a function.
+	{
+		type_inlinefunction = true;
 		return QCC_PR_ParseFunctionType(newtype, type);
+	}
 	else
 	{
 		if (newtype)