diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index e676c988..fb93293f 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -2582,6 +2582,7 @@ void BfExprEvaluator::Visit(BfTypeReference* typeRef) void BfExprEvaluator::Visit(BfAttributedExpression* attribExpr) { BfAttributeState attributeState; + attributeState.mSrc = attribExpr->mAttributes; attributeState.mTarget = (BfAttributeTargets)(BfAttributeTargets_Invocation | BfAttributeTargets_MemberAccess); if (auto block = BfNodeDynCast(attribExpr->mExpression)) attributeState.mTarget = BfAttributeTargets_Block; @@ -2606,10 +2607,7 @@ void BfExprEvaluator::Visit(BfAttributedExpression* attribExpr) VisitChild(attribExpr->mExpression); } - if (!attributeState.mUsed) - { - mModule->Fail("Unused attributes", attribExpr->mAttributes); - } + mModule->FinishAttributeState(&attributeState); } void BfExprEvaluator::Visit(BfBlock* blockExpr) @@ -13769,6 +13767,10 @@ void BfExprEvaluator::InjectMixin(BfAstNode* targetSrc, BfTypedValue target, boo { //TODO: Implement } + else if (newLocalVar->mResolvedType->IsValuelessType()) + { + // Do nothing + } else { BfIRValue value = newLocalVar->mValue; @@ -14682,10 +14684,8 @@ void BfExprEvaluator::DoInvocation(BfAstNode* target, BfMethodBoundExpression* m mResult = MatchMethod(methodNodeSrc, methodBoundExpr, thisValue, allowImplicitThis, bypassVirtual, targetFunctionName, argValues, methodGenericArguments, checkedKind); argValues.HandleFixits(mModule); - if ((mModule->mAttributeState == &attributeState) && (!attributeState.mUsed)) - { - mModule->Fail("Unused attributes", attributeState.mSrc); - } + if (mModule->mAttributeState == &attributeState) + mModule->FinishAttributeState(&attributeState); if (isCascade) { diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index d705633d..7d897241 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -10544,6 +10544,12 @@ BfCustomAttributes* BfModule::GetCustomAttributes(BfAttributeDirective* attribut return customAttributes; } +void BfModule::FinishAttributeState(BfAttributeState* attributeState) +{ + if ((!attributeState->mUsed) && (attributeState->mSrc != NULL)) + Warn(0, "Unused attributes", attributeState->mSrc); +} + void BfModule::ProcessTypeInstCustomAttributes(bool& isPacked, bool& isUnion, bool& isCRepr, bool& isOrdered) { if (mCurTypeInstance->mCustomAttributes != NULL) diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index f505c1db..187e9d2e 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -1466,6 +1466,7 @@ public: void ValidateCustomAttributes(BfCustomAttributes* customAttributes, BfAttributeTargets attrTarget); void GetCustomAttributes(BfCustomAttributes* customAttributes, BfAttributeDirective* attributesDirective, BfAttributeTargets attrType, bool allowNonConstArgs = false, BfCaptureInfo* captureInfo = NULL); BfCustomAttributes* GetCustomAttributes(BfAttributeDirective* attributesDirective, BfAttributeTargets attrType, bool allowNonConstArgs = false, BfCaptureInfo* captureInfo = NULL); + void FinishAttributeState(BfAttributeState* attributeState); void ProcessTypeInstCustomAttributes(bool& isPacked, bool& isUnion, bool& isCRepr, bool& isOrdered); void ProcessCustomAttributeData(); bool TryGetConstString(BfIRConstHolder* constHolder, BfIRValue irValue, StringImpl& str); diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index c7ba8d76..6d80c58d 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -3760,7 +3760,7 @@ void BfModule::Visit(BfLocalMethodDeclaration* methodDecl) void BfModule::Visit(BfAttributedStatement* attribStmt) { BfAttributeState attributeState; - + attributeState.mSrc = attribStmt->mAttributes; attributeState.mTarget = (BfAttributeTargets)(BfAttributeTargets_Invocation | BfAttributeTargets_MemberAccess); if (auto block = BfNodeDynCast(attribStmt->mStatement)) attributeState.mTarget = BfAttributeTargets_Block; @@ -3786,10 +3786,7 @@ void BfModule::Visit(BfAttributedStatement* attribStmt) VisitChild(attribStmt->mStatement); } - if (!attributeState.mUsed) - { - Fail("Unused attributes", attribStmt->mAttributes); - } + FinishAttributeState(&attributeState); } void BfModule::Visit(BfExpression* expression)