From b128180a150bac12c2015d363fe3fd5908664fcd Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Thu, 7 May 2020 11:02:39 -0700 Subject: [PATCH] Fixed some places where variable declarations should be illegal --- IDEHelper/Compiler/BfExprEvaluator.cpp | 14 +++++++++++++- IDEHelper/Compiler/BfModule.cpp | 2 +- IDEHelper/Compiler/BfModule.h | 4 +++- IDEHelper/Compiler/BfStmtEvaluator.cpp | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index dd104822..d004ebfd 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -2456,6 +2456,16 @@ bool BfExprEvaluator::HasVariableDeclaration(BfAstNode* checkNode) void BfExprEvaluator::Visit(BfVariableDeclaration* varDecl) { mModule->UpdateExprSrcPos(varDecl); + + if ((mModule->mCurMethodState == NULL) || (!mModule->mCurMethodState->mCurScope->mAllowVariableDeclarations)) + { + mModule->Fail("Variable declarations are not allowed in this context", varDecl); + if (varDecl->mInitializer != NULL) + { + VisitChild(varDecl->mInitializer); + } + return; + } CheckVariableDeclaration(varDecl, true, false, false); if (varDecl->mInitializer == NULL) @@ -5017,6 +5027,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu // Temporarily disable so we don't capture calls in params SetAndRestoreValue prevBindResult(mFunctionBindResult, NULL); + SetAndRestoreValue prevAllowVariableDeclarations(mModule->mCurMethodState->mCurScope->mAllowVariableDeclarations, false); // Don't allow variable declarations in arguments BfMethodInstance* methodInstance = moduleMethodInstance.mMethodInstance; @@ -5827,7 +5838,7 @@ BfTypedValue BfExprEvaluator::ResolveArgValue(BfResolvedArg& resolvedArg, BfType { BfExprEvaluator exprEvaluator(mModule); exprEvaluator.mReceivingValue = receivingValue; - BfEvalExprFlags flags = BfEvalExprFlags_NoCast; + BfEvalExprFlags flags = (BfEvalExprFlags)(BfEvalExprFlags_NoCast); if ((paramKind == BfParamKind_Params) || (paramKind == BfParamKind_DelegateParam)) flags = (BfEvalExprFlags)(flags | BfEvalExprFlags_AllowParamsExpr); @@ -6154,6 +6165,7 @@ BfTypedValue BfExprEvaluator::MatchMethod(BfAstNode* targetSrc, BfMethodBoundExp // Temporarily disable so we don't capture calls in params SetAndRestoreValue prevBindResult(mFunctionBindResult, NULL); + SetAndRestoreValue prevAllowVariableDeclarations(mModule->mCurMethodState->mCurScope->mAllowVariableDeclarations, false); // Don't allow variable declarations in arguments sInvocationIdx++; diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 808029f1..feb28ce3 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -12412,7 +12412,7 @@ void BfModule::DoAddLocalVariable(BfLocalVariable* localVar) } BfLocalVariable* BfModule::AddLocalVariableDef(BfLocalVariable* localVarDef, bool addDebugInfo, bool doAliasValue, BfIRValue declareBefore, BfIRInitType initType) -{ +{ if ((localVarDef->mValue) && (!localVarDef->mAddr) && (IsTargetingBeefBackend())) { if ((!localVarDef->mValue.IsConst()) && (!localVarDef->mValue.IsArg()) && (!localVarDef->mValue.IsFake())) diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index f1120c91..cd100a9a 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -66,7 +66,7 @@ enum BfEvalExprFlags BfEvalExprFlags_FieldInitializer = 0x2000, BfEvalExprFlags_VariableDeclaration = 0x4000, BfEvalExprFlags_NoAutoComplete = 0x8000, - BfEvalExprFlags_AllowNonConst = 0x10000 + BfEvalExprFlags_AllowNonConst = 0x10000 }; enum BfCastFlags @@ -314,6 +314,7 @@ public: bool mAllowTargeting; bool mHadScopeValueRetain; bool mIsDeferredBlock; + bool mAllowVariableDeclarations; BfBlock* mAstBlock; BfAstNode* mCloseNode; BfExprEvaluator* mExprEvaluator; @@ -346,6 +347,7 @@ public: mHadScopeValueRetain = false; mIsDeferredBlock = false; mAllowTargeting = true; + mAllowVariableDeclarations = true; mMixinDepth = 0; mScopeDepth = 0; } diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index 26daf2fb..74fcae80 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -1591,7 +1591,7 @@ BfLocalVariable* BfModule::HandleVariableDeclaration(BfVariableDeclaration* varD bool wantsStore = false; if ((initValue) && (!handledVarStore) && (!isConst) && (!initHandled)) - { + { initValue = LoadValue(initValue); if (initValue.IsSplat()) {