From 5743de11677eb7ab825ea4700d1d12e8808130ea Mon Sep 17 00:00:00 2001 From: Spoike Date: Sat, 28 May 2022 18:00:09 +0000 Subject: [PATCH] Make fteqcc handle dupe typedefs better (primarily to fix autoproto). git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@6253 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/qclib/qcc_pr_comp.c | 26 +++++++++++++++++++++----- engine/qclib/qcc_pr_lex.c | 15 ++++++++++++++- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/engine/qclib/qcc_pr_comp.c b/engine/qclib/qcc_pr_comp.c index bf61548b8..3a00491fc 100644 --- a/engine/qclib/qcc_pr_comp.c +++ b/engine/qclib/qcc_pr_comp.c @@ -2021,7 +2021,7 @@ static QCC_sref_t QCC_SupplyConversion(QCC_sref_t var, etype_t wanted, pbool fa { if (flag_laxcasts) { - QCC_PR_ParseWarning(WARN_LAXCAST, "Implicit type mismatch. Needed %s, got %s.", basictypenames[wanted], basictypenames[var.cast->type]); + QCC_PR_ParseWarning(WARN_LAXCAST, "Implicit type mismatch. Needed %s%s%s, got %s%s%s.", col_type,basictypenames[wanted],col_none, col_type,basictypenames[var.cast->type],col_none); QCC_PR_ParsePrintSRef(WARN_LAXCAST, var); } else @@ -17754,6 +17754,7 @@ QCC_type_t *QCC_PR_ParseEnum(pbool flags) void QCC_PR_ParseTypedef(void) { + QCC_type_t *old; QCC_type_t *type = QCC_PR_ParseType(false, false); if (!type) { @@ -17800,10 +17801,25 @@ void QCC_PR_ParseTypedef(void) } else { - type = QCC_PR_DuplicateType(type, false); - type->name = name; - type->typedefed = true; - pHash_Add(&typedeftable, name, type, qccHunkAlloc(sizeof(bucket_t))); + old = QCC_TypeForName(name); + if (old) + { + if (typecmp(old, type)) + { + char obuf[1024]; + char nbuf[1024]; + old->typedefed = false; + QCC_PR_ParseWarning(ERR_NOTATYPE, "Cannot redeclare typedef %s%s%s from %s%s%s to %s%s%s", col_type,name,col_none, col_type,TypeName(old, obuf, sizeof(obuf)),col_none, col_type,TypeName(type, nbuf, sizeof(nbuf)),col_none); + old->typedefed = true; + } + } + else + { + type = QCC_PR_DuplicateType(type, false); + type->name = name; + type->typedefed = true; + pHash_Add(&typedeftable, name, type, qccHunkAlloc(sizeof(bucket_t))); + } } } while(QCC_PR_CheckToken(",")); QCC_PR_Expect(";"); diff --git a/engine/qclib/qcc_pr_lex.c b/engine/qclib/qcc_pr_lex.c index 609cd6985..03df6e7c0 100644 --- a/engine/qclib/qcc_pr_lex.c +++ b/engine/qclib/qcc_pr_lex.c @@ -4726,6 +4726,14 @@ static void Q_strlcat(char *dest, const char *src, int sizeofdest) char *TypeName(QCC_type_t *type, char *buffer, int buffersize) { char *ret; + /*if (type->typedefed) + { + if (buffersize < 0) + return buffer; + *buffer = 0; + Q_strlcat(buffer, type->name, buffersize); + return buffer; + }*/ if (type->type == ev_void) { @@ -5599,7 +5607,12 @@ QCC_type_t *QCC_PR_ParseType (int newtype, pbool silentfail) QCC_PR_ParseError(ERR_NOTANAME, "Accessor %s cannot be based upon %s", accessorname, parentname); } else if (type != newt->parentclass) - QCC_PR_ParseError(ERR_NOTANAME, "Accessor %s basic type mismatch", accessorname); + { + char bufe[256]; + char bufn[256]; + QCC_PR_ParseError(ERR_NOTANAME, "Accessor %s basic type mismatch (%s, expected %s)", accessorname, + TypeName(type, bufn, sizeof(bufn)), TypeName(newt->parentclass, bufe, sizeof(bufe))); + } if (QCC_PR_CheckToken("{")) {