ソースを参照

Improved "const" handling of local variable when referencing globals

Brian Fiete 2 ヶ月 前
コミット
e7a966c1b5

+ 1 - 25
IDEHelper/Compiler/BfExprEvaluator.cpp

@@ -4340,31 +4340,7 @@ BfTypedValue BfExprEvaluator::LoadLocal(BfLocalVariable* varDecl, bool allowRef)
 	}
 	else if (varDecl->mConstValue)
 	{
-		localResult = BfTypedValue(varDecl->mConstValue, varDecl->mResolvedType, false);
-
-		if ((varDecl->mResolvedType->IsRef()) && (!allowRef))
-		{
-			BfRefType* refType = (BfRefType*)varDecl->mResolvedType;
-			BfType* innerType = refType->mElementType;
-
-			if (innerType->IsValuelessNonOpaqueType())
-			{
-				if (refType->mRefKind == BfRefType::RefKind_Mut)
-					return BfTypedValue(mModule->mBfIRBuilder->GetFakeVal(), innerType, BfTypedValueKind_MutableValue);
-				return BfTypedValue(mModule->mBfIRBuilder->GetFakeVal(), innerType, varDecl->mIsReadOnly ? BfTypedValueKind_ReadOnlyAddr : BfTypedValueKind_Addr);
-			}
-
-			if (refType->mRefKind == BfRefType::RefKind_Mut)
-			{
-				if (innerType->IsGenericParam())
-				{
-					localResult = BfTypedValue(varDecl->mConstValue, innerType, BfTypedValueKind_MutableValue);
-					return localResult;
-				}
-			}
-
-			localResult = BfTypedValue(varDecl->mConstValue, innerType, varDecl->mIsReadOnly ? BfTypedValueKind_ReadOnlyAddr : BfTypedValueKind_Addr);
-		}
+		localResult = BfTypedValue(varDecl->mConstValue, varDecl->mResolvedType, false);		
 	}
 	else if (varDecl->mIsSplat)
 	{

+ 4 - 0
IDEHelper/Compiler/BfIRBuilder.cpp

@@ -666,6 +666,10 @@ bool BfIRConstHolder::IsConstValue(BfIRValue value)
 		return false;
 	if (constant->mConstType == BfConstType_Undef)
 		return false;
+	if (constant->mConstType == BfConstType_GEP32_2)	
+		return IsConstValue(BfIRValue(BfIRValueFlags_Const, ((BfConstantGEP32_2*)constant)->mTarget));	
+	if (constant->mConstType == BfConstType_BitCast)
+		return IsConstValue(BfIRValue(BfIRValueFlags_Const, ((BfConstantBitCast*)constant)->mTarget));
 
 	return true;
 }

+ 2 - 2
IDEHelper/Compiler/BfStmtEvaluator.cpp

@@ -1714,10 +1714,10 @@ BfLocalVariable* BfModule::HandleVariableDeclaration(BfVariableDeclaration* varD
 			localDef->mIsReadOnly = true;
 			if (initValue)
 			{
-				if ((initValue.mValue) && (initValue.mValue.IsConst()))
+				if (mBfIRBuilder->IsConstValue(initValue.mValue))
 				{
 					isConst = true;
-				}
+				}				
 			}
 		}
 	}