Przeglądaj źródła

Fixed enum casting with implicit 'int' operator

Brian Fiete 7 miesięcy temu
rodzic
commit
06c5e06a58

+ 2 - 3
IDEHelper/Compiler/BfModuleTypeUtils.cpp

@@ -14689,7 +14689,6 @@ BfIRValue BfModule::CastToValue(BfAstNode* srcNode, BfTypedValue typedVal, BfTyp
 			{
 				auto fromType = typedVal.mType;
 
-				// Handle the typedPrim<->underlying part implicitly
 				if (fromType->IsTypedPrimitive())
 				{
 					typedVal = LoadValue(typedVal);
@@ -14699,11 +14698,11 @@ BfIRValue BfModule::CastToValue(BfAstNode* srcNode, BfTypedValue typedVal, BfTyp
 						if (methodMatcher.mBestRawMethodInstance)
 							convTypedValue = GetDefaultTypedValue(methodMatcher.mBestRawMethodInstance->mReturnType);
 					}
-					return CastToValue(srcNode, convTypedValue, toType, (BfCastFlags)(castFlags & ~BfCastFlags_Explicit), NULL);
+					return CastToValue(srcNode, convTypedValue, toType, castFlags, NULL);
 				}
 				else if (toType->IsTypedPrimitive())
 				{
-					auto castedVal = CastToValue(srcNode, typedVal, toType->GetUnderlyingType(), (BfCastFlags)(castFlags & ~BfCastFlags_Explicit), NULL);
+					auto castedVal = CastToValue(srcNode, typedVal, toType->GetUnderlyingType(), castFlags, NULL);
 					return castedVal;
 				}
 			}

+ 16 - 0
IDEHelper/Tests/src/Enums.bf

@@ -109,6 +109,15 @@ namespace Tests
 			public static int operator implicit(Self self);
 		}
 
+		public enum EnumM
+		{
+		    public static implicit operator int(Self self);
+
+		    case A;
+		    case B;
+		    case C;
+		}
+
 		[Test]
 		static void TestBasic()
 		{
@@ -118,6 +127,13 @@ namespace Tests
 			Test.Assert(sizeof(EnumB) == 2);
 			Test.Assert(sizeof(EnumC) == 4);
 			Test.Assert(sizeof(EnumD) == 8);
+
+			EnumM em = ?;
+			int i = em;
+			uint u = (uint)em;
+
+			i = 123;
+			EnumA e = (EnumA)i;
 		}
 
 		[Test]