diff --git a/IDEHelper/Compiler/BfParser.cpp b/IDEHelper/Compiler/BfParser.cpp index 1283b181..7440383a 100644 --- a/IDEHelper/Compiler/BfParser.cpp +++ b/IDEHelper/Compiler/BfParser.cpp @@ -363,21 +363,18 @@ bool BfParserData::IsUnwarnedAt(BfAstNode* node) bool BfParserData::IsWarningEnabledAtSrcIndex(int warningNumber, int srcIdx) { int enabled = 1; //CDH TODO if/when we add warning level support, this default will change based on the warning number and the general project warning level setting - int lastUnwarnPos = 0; for (const auto& it : mWarningEnabledChanges) { if (it.mKey > srcIdx) break; - if (it.mValue.mWarningNumber == warningNumber) + if ((it.mValue.mWarningNumber == warningNumber) || (it.mValue.mWarningNumber == -1)) { if (it.mValue.mEnable) enabled++; else enabled--; - } - if (it.mValue.mWarningNumber == -1) - lastUnwarnPos = -1; + } } return enabled > 0; } @@ -923,10 +920,14 @@ void BfParser::HandlePragma(const StringImpl& pragma, BfBlock* block) mPassInstance->FailAt("Expected \"disable\" or \"restore\" after \"warning\"", mSourceData, iterNode->GetSrcStart(), iterNode->GetSrcLength()); } - //iterNode = parentNode->mChildArr.GetAs(++curIdx); + int srcStart = iterNode->GetSrcStart(); + + int nodeCount = 0; + iterNode = itr.Get(); while (iterNode) { + ++nodeCount; ++itr; auto tokenStr = iterNode->ToString(); if (tokenStr != ",") // commas allowed between warning numbers but not required; we just ignore them @@ -941,11 +942,14 @@ void BfParser::HandlePragma(const StringImpl& pragma, BfBlock* block) break; } } - if (isNum) + + int warningNum = atoi(tokenStr.c_str()); + + if ((isNum) && (warningNum > 0)) { BfParserWarningEnabledChange wec; wec.mEnable = enable; - wec.mWarningNumber = atoi(tokenStr.c_str()); + wec.mWarningNumber = warningNum; mParserData->mWarningEnabledChanges[iterNode->GetSrcStart()] = wec; } else @@ -953,10 +957,17 @@ void BfParser::HandlePragma(const StringImpl& pragma, BfBlock* block) mPassInstance->FailAt("Expected decimal warning number", mSourceData, iterNode->GetSrcStart(), iterNode->GetSrcLength()); } } - - //iterNode = parentNode->mChildArr.Get(++curIdx); + iterNode = itr.Get(); } + + if (nodeCount == 0) + { + BfParserWarningEnabledChange wec; + wec.mEnable = enable; + wec.mWarningNumber = -1; + mParserData->mWarningEnabledChanges[srcStart] = wec; + } } else { diff --git a/IDEHelper/Compiler/BfSystem.cpp b/IDEHelper/Compiler/BfSystem.cpp index ee618636..13813e16 100644 --- a/IDEHelper/Compiler/BfSystem.cpp +++ b/IDEHelper/Compiler/BfSystem.cpp @@ -1762,7 +1762,7 @@ BfError* BfPassInstance::WarnAt(int warningNumber, const StringImpl& warning, Bf return NULL; auto bfParser = bfSource->ToParserData(); - if ((bfParser != NULL) && (warningNumber > 0) && (!bfParser->IsWarningEnabledAtSrcIndex(warningNumber, srcIdx))) + if ((bfParser != NULL) && (!bfParser->IsWarningEnabledAtSrcIndex(warningNumber, srcIdx))) return NULL; if (!WantsRangeRecorded(bfParser, srcIdx, srcLen, true, isDeferred))