diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index d8a821b..c1de01f 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -8985,6 +8985,9 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray case IA_CMPGU: if (s1 >= 0) { + if (mInstructions[sz - 2]->mSrc[1].mRange.mMinState == IntegerValueRange::S_BOUND && mInstructions[sz - 2]->mSrc[1].mRange.mMinValue < 0) + mTrueValueRange[s1].mMaxState = IntegerValueRange::S_UNBOUND; + mTrueValueRange[s1].LimitMin(1); if (s0 < 0) { @@ -22006,7 +22009,7 @@ void InterCodeProcedure::Close(void) { GrowingTypeArray tstack(IT_NONE); - CheckFunc = !strcmp(mIdent->mString, "main"); + CheckFunc = !strcmp(mIdent->mString, "e1"); CheckCase = false; mEntryBlock = mBlocks[0]; diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index 7fc320a..87ee91a 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -412,10 +412,17 @@ Declaration* Parser::ParseStructDeclaration(uint64 flags, DecType dt, Declaratio bitsleft = bitsleft + 8 - mdec->mBits; offset++; } + else if (mdec->mOffset >= 2) + { + mdec->mOffset -= 2; + mdec->mShift = 16 - bitsleft; + bitsleft = bitsleft + 16 - mdec->mBits; + offset += 2; + } else { - mdec->mOffset -= 3; - mdec->mShift = 24 - bitsleft; + mdec->mOffset--; + mdec->mShift = 8 - bitsleft; bitsleft = bitsleft + 16 - mdec->mBits; offset += 2; } @@ -428,15 +435,32 @@ Declaration* Parser::ParseStructDeclaration(uint64 flags, DecType dt, Declaratio offset += 3; } else if (bitsleft + 16 >= mdec->mBits) + { + if (mdec->mOffset >= 2) + { + mdec->mOffset -= 2; + mdec->mShift = 16 - bitsleft; + bitsleft = bitsleft + 16 - mdec->mBits; + offset += 2; + } + else + { + mdec->mOffset--; + mdec->mShift = 8 - bitsleft; + bitsleft = bitsleft + 16 - mdec->mBits; + offset += 2; + } + } + else if (mdec->mOffset >= 2) { mdec->mOffset -= 2; mdec->mShift = 16 - bitsleft; - bitsleft = bitsleft + 16 - mdec->mBits; - offset += 2; + bitsleft = bitsleft + 24 - mdec->mBits; + offset += 3; } else { - mdec->mOffset -= 1; + mdec->mOffset--; mdec->mShift = 8 - bitsleft; bitsleft = bitsleft + 24 - mdec->mBits; offset += 3; @@ -6284,7 +6308,7 @@ Expression* Parser::ParseSimpleExpression(bool lhs, bool tid) Declaration* Parser::MemberLookup(Declaration* dtype, const Ident* ident, int & offset, uint64& flags) { - if (ident == dtype->mIdent) + if ((mCompilerOptions & COPT_CPLUSPLUS) && ident == dtype->mIdent) return nullptr; Declaration* mdec = dtype->mScope->Lookup(ident, SLEVEL_CLASS);