From 1a9366041620c30dcf032d6e614fe45666b05382 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 18 Apr 2022 07:57:15 -0700 Subject: [PATCH] Better handling of undef const expressions --- IDEHelper/Compiler/BfExprEvaluator.cpp | 8 ++++++++ IDEHelper/Compiler/BfModuleTypeUtils.cpp | 19 ++++++++++++++++++- IDEHelper/Compiler/BfResolvedTypeUtils.h | 3 +++ IDEHelper/Tests/src/Generics2.bf | 13 +++++++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 8e21cf33..96a16a9d 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -3801,6 +3801,14 @@ void BfExprEvaluator::GetLiteral(BfAstNode* refNode, const BfVariant& variant) case BfTypeCode_StringId: mResult = BfTypedValue(mModule->mBfIRBuilder->CreateConst(variant.mTypeCode, variant.mUInt64), mModule->ResolveTypeDef(mModule->mCompiler->mStringTypeDef)); break; + case BfTypeCode_Let: + if (mExpectingType != NULL) + { + mResult = BfTypedValue(mModule->mBfIRBuilder->CreateUndefValue(mModule->mBfIRBuilder->MapType(mExpectingType)), mExpectingType); + break; + } + mModule->Fail("Invalid undef literal", refNode); + break; default: mModule->Fail("Invalid literal", refNode); break; diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 67799300..dd817125 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -6903,7 +6903,19 @@ BfConstExprValueType* BfModule::CreateConstExprValueType(const BfTypedValue& typ BfResolveTypeRefFlags resolveFlags = allowCreate ? BfResolveTypeRefFlag_None : BfResolveTypeRefFlag_NoCreate; auto variant = TypedValueToVariant(NULL, typedValue); + if (variant.mTypeCode == BfTypeCode_None) + { + if (auto constant = mBfIRBuilder->GetConstant(typedValue.mValue)) + { + if (constant->mConstType == BfConstType_Undef) + { + variant.mTypeCode = BfTypeCode_Let; + } + } + } + + if (variant.mTypeCode == BfTypeCode_None) return NULL; auto constExprValueType = mContext->mConstExprValueTypePool.Get(); @@ -12895,7 +12907,7 @@ BfIRValue BfModule::CastToValue(BfAstNode* srcNode, BfTypedValue typedVal, BfTyp { BfConstExprValueType* toConstExprValueType = (BfConstExprValueType*)toType; - auto variantVal = TypedValueToVariant(srcNode, typedVal); + auto variantVal = TypedValueToVariant(srcNode, typedVal, true); if ((mBfIRBuilder->IsIntable(variantVal.mTypeCode)) && (mBfIRBuilder->IsIntable(toConstExprValueType->mValue.mTypeCode))) { if (variantVal.mInt64 == toConstExprValueType->mValue.mInt64) @@ -12914,6 +12926,11 @@ BfIRValue BfModule::CastToValue(BfAstNode* srcNode, BfTypedValue typedVal, BfTyp return typedVal.mValue; } + if ((toConstExprValueType->mValue.mTypeCode == BfTypeCode_Let) && (constant->mConstType == BfConstType_Undef)) + { + return typedVal.mValue; + } + if (!ignoreErrors) { String valStr; diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index 2ab7b5b9..3ee4d82f 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -2511,6 +2511,9 @@ public: virtual bool IsConstExprValue() override { return true; } virtual BfType* GetUnderlyingType() override { return mType; } + + virtual bool IsUnspecializedType() { return mValue.mTypeCode == BfTypeCode_Let; } + virtual bool IsUnspecializedTypeVariation() { return mValue.mTypeCode == BfTypeCode_Let; } }; /*class BfCustomAttributeArgument diff --git a/IDEHelper/Tests/src/Generics2.bf b/IDEHelper/Tests/src/Generics2.bf index 0809055a..9eeb99af 100644 --- a/IDEHelper/Tests/src/Generics2.bf +++ b/IDEHelper/Tests/src/Generics2.bf @@ -121,6 +121,18 @@ namespace Tests return total; } + public static int StrTest(T param2) + where T : const String + { + return StrTest2(param2); + } + + public static int StrTest2(T param1) + where T : const String + { + return param1.Length; + } + [Test] public static void TestBasics() { @@ -136,6 +148,7 @@ namespace Tests Test.Assert(BigNum.N == 3); Test.Assert(Test("test", 1, 2, 3) == 10); + Test.Assert(StrTest("ABCDE") == 5); } } }