From a2ca0de8097989da6146044f0998f90ea76c4642 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Sun, 15 Sep 2024 16:14:44 +0200 Subject: [PATCH] Fix compare pointer to rvalue refs --- oscar64/Declaration.cpp | 10 ++++++++++ oscar64/Declaration.h | 1 + oscar64/Errors.h | 2 ++ oscar64/InterCodeGenerator.cpp | 7 +++++-- oscar64/Parser.cpp | 18 ++++++++++++++++++ 5 files changed, 36 insertions(+), 2 deletions(-) diff --git a/oscar64/Declaration.cpp b/oscar64/Declaration.cpp index 3193302..0100470 100644 --- a/oscar64/Declaration.cpp +++ b/oscar64/Declaration.cpp @@ -2323,6 +2323,16 @@ bool Declaration::IsSameMutable(const Declaration* dec) const return false; } +bool Declaration::IsConstRefSame(const Declaration* dec) const +{ + if (IsReference()) + return mBase->IsConstRefSame(dec); + else if (dec->IsReference()) + return IsConstRefSame(dec->mBase); + else + return IsConstSame(dec); +} + bool Declaration::IsConstSame(const Declaration* dec) const { if (this == dec) diff --git a/oscar64/Declaration.h b/oscar64/Declaration.h index 367e706..763d5c1 100644 --- a/oscar64/Declaration.h +++ b/oscar64/Declaration.h @@ -306,6 +306,7 @@ public: bool IsSame(const Declaration* dec) const; bool IsDerivedFrom(const Declaration* dec) const; bool IsSubType(const Declaration* dec) const; + bool IsConstRefSame(const Declaration* dec) const; bool IsConstSame(const Declaration* dec) const; bool IsSameValue(const Declaration* dec) const; bool IsSameParams(const Declaration* dec) const; diff --git a/oscar64/Errors.h b/oscar64/Errors.h index 85548c8..6a87e5d 100644 --- a/oscar64/Errors.h +++ b/oscar64/Errors.h @@ -41,6 +41,7 @@ enum ErrorID EWARN_FLOAT_TO_INT, EWARN_UNDEFINED_POINTER_ARITHMETIC, EWARN_INVALID_VALUE_RANGE, + EWARN_DEFAULT_COPY_DEPRECATED, EERR_GENERIC = 3000, EERR_FILE_NOT_FOUND, @@ -111,6 +112,7 @@ enum ErrorID EERR_INVALID_PREPROCESSOR, EERR_INVALID_CLASS_INITIALIZER, + EERR_CALL_OF_DELETED_FUNCTION, EFATAL_GENERIC = 4000, EFATAL_OUT_OF_MEMORY, diff --git a/oscar64/InterCodeGenerator.cpp b/oscar64/InterCodeGenerator.cpp index cf0cf05..7ea2c19 100644 --- a/oscar64/InterCodeGenerator.cpp +++ b/oscar64/InterCodeGenerator.cpp @@ -1818,7 +1818,10 @@ void InterCodeGenerator::CopyStruct(InterCodeProcedure* proc, Expression* exp, I if (!(pdec->mFlags & DTF_FPARAM_UNUSED)) block->Append(wins); - TranslateExpression(ftype, proc, block, fexp, destack, gotos, BranchTarget(), BranchTarget(), &nmapper); + if (!fexp) + mErrors->Error(exp->mLocation, EERR_CALL_OF_DELETED_FUNCTION, "Call of deleted copy constructor"); + else + TranslateExpression(ftype, proc, block, fexp, destack, gotos, BranchTarget(), BranchTarget(), &nmapper); InterInstruction* jins = new InterInstruction(MapLocation(exp, inlineMapper), IC_JUMP); block->Append(jins); @@ -3282,7 +3285,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* ; else if ((mCompilerOptions & COPT_CPLUSPLUS) && (vl.mType->mBase->IsSubType(vr.mType->mBase) || vr.mType->mBase->IsSubType(vl.mType->mBase))) ; - else if (!vl.mType->mBase->IsConstSame(vr.mType->mBase)) + else if (!vl.mType->mBase->IsConstRefSame(vr.mType->mBase)) mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Incompatible pointer types", vl.mType->mBase->MangleIdent(), vr.mType->mBase->MangleIdent()); } else diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index 17b4e38..b1f916c 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -2345,6 +2345,7 @@ void Parser::AddDefaultConstructors(Declaration* pthis) bool inlineConstructor = true; bool inlineCopy = true; bool inlineMove = true; + bool explicitDestructor = false; const Ident* dtorident = pthis->mBase->mIdent->PreMangle("~");; @@ -2374,7 +2375,10 @@ void Parser::AddDefaultConstructors(Declaration* pthis) Declaration* ddec = pthis->mBase->mScope->Lookup(dtorident, SLEVEL_SCOPE); if (ddec) + { pthis->mBase->mDestructor = ddec; + explicitDestructor = true; + } Declaration* adec = pthis->mBase->mScope->Lookup(Ident::Unique("operator="), SLEVEL_SCOPE); while (adec) @@ -2423,6 +2427,12 @@ void Parser::AddDefaultConstructors(Declaration* pthis) if (pthis->mBase->mVTable) simpleConstructor = false; + if (explicitDestructor) + { + simpleCopy = false; + simpleAssignment = false; + } + Declaration* dec = pthis->mBase->mParams; while (dec) { @@ -2589,6 +2599,9 @@ void Parser::AddDefaultConstructors(Declaration* pthis) cdec->mVarIndex = -1; + if (explicitDestructor) + mErrors->Error(pthis->mBase->mLocation, EWARN_DEFAULT_COPY_DEPRECATED, "Default copy constructor deprecated due to explicit destructor"); + cdec->mValue = new Expression(mScanner->mLocation, EX_VOID); // Now add all the copying @@ -2758,6 +2771,9 @@ void Parser::AddDefaultConstructors(Declaration* pthis) cdec->mVarIndex = -1; + if (explicitDestructor) + mErrors->Error(pthis->mBase->mLocation, EWARN_DEFAULT_COPY_DEPRECATED, "Default copy constructor deprecated due to explicit destructor"); + Expression* pthisexp = new Expression(pthis->mLocation, EX_VARIABLE); pthisexp->mDecType = pthis; pthisexp->mDecValue = cdec->mBase->mParams; @@ -10168,6 +10184,8 @@ Declaration* Parser::ParseTemplateExpansion(Declaration* tmpld, Declaration* exp packd->mBase = new Declaration(dec->mLocation, DT_PACK_TYPE); if (ppdec) ppdec->mNext = packd; + else if (tdec->mParams && !tdec->mParams->mNext && tdec->mParams->mType == DT_TYPE_TEMPLATE) + ; else tdec->mParams = packd;