From 54296bdd71b75fd5cbf35e9adbcb5948ebdaf96c Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Sun, 20 Aug 2023 15:06:51 +0200 Subject: [PATCH] Add friend classes --- include/opp/iostream.cpp | 2 +- oscar64/Parser.cpp | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/include/opp/iostream.cpp b/include/opp/iostream.cpp index 1faabed..b53d408 100644 --- a/include/opp/iostream.cpp +++ b/include/opp/iostream.cpp @@ -13,7 +13,7 @@ inline ios::~ios(void) } -char ios::fill(void) +char ios::fill(void) const { return mFill; } diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index 79c4997..1318abb 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -256,6 +256,8 @@ Declaration* Parser::ParseStructDeclaration(uint64 flags, DecType dt, Declaratio { mScope = oscope; Declaration* fdec = ParseDeclaration(nullptr, true, false); + if (fdec->mType == DT_ANON) + fdec = fdec->mBase; dec->mFriends.Push(fdec); mScope = dec->mScope; } @@ -268,8 +270,6 @@ Declaration* Parser::ParseStructDeclaration(uint64 flags, DecType dt, Declaratio Declaration* mdec = ParseDeclaration(nullptr, false, false, pthis); if (mdec) { - mdec->mFlags |= flags & (DTF_PRIVATE | DTF_PROTECTED); - mdec->mQualIdent = dec->mScope->Mangle(mdec->mIdent); int offset = dec->mSize; @@ -278,6 +278,8 @@ Declaration* Parser::ParseStructDeclaration(uint64 flags, DecType dt, Declaratio if (mdec->mBase->mType == DT_TYPE_FUNCTION) { + mdec->mFlags |= flags & (DTF_PRIVATE | DTF_PROTECTED); + if (mdec->mBase->mFlags & DTF_VIRTUAL) needVTable = true; @@ -293,6 +295,8 @@ Declaration* Parser::ParseStructDeclaration(uint64 flags, DecType dt, Declaratio } else if ((mCompilerOptions & COPT_CPLUSPLUS) && mdec->mType == DT_ANON) { + mdec->mFlags |= flags & (DTF_PRIVATE | DTF_PROTECTED); + ConsumeToken(TK_SEMICOLON); // anon element } @@ -300,6 +304,8 @@ Declaration* Parser::ParseStructDeclaration(uint64 flags, DecType dt, Declaratio { while (mdec) { + mdec->mFlags |= flags & (DTF_PRIVATE | DTF_PROTECTED); + if (!(mdec->mBase->mFlags & DTF_DEFINED)) mErrors->Error(mdec->mLocation, EERR_UNDEFINED_OBJECT, "Undefined type used in struct member declaration"); @@ -3915,7 +3921,12 @@ Declaration* Parser::ParseDeclaration(Declaration * pdec, bool variable, bool ex } if (!pdec) + { + if (!pthis && (ndec->mBase->mFlags & DTF_FUNC_THIS)) + mErrors->Error(ndec->mLocation, EERR_DECLARATION_DIFFERS, "Function declaration differs", ndec->mIdent); + pcdec->mNext = ndec; + } } if (pdec) @@ -4870,6 +4881,8 @@ Expression* Parser::ParseQualify(Expression* exp) { if (dtype->mFriends.Contains(mFunction)) ; + else if (mThisPointer && mThisPointer->mBase && mThisPointer->mBase->mBase && dtype->mFriends.Contains(mThisPointer->mBase->mBase->ToMutableType())) + ; else mErrors->Error(mScanner->mLocation, EERR_OBJECT_NOT_FOUND, "Struct member identifier not visible", ident); }