Browse Source

Fixed packing issue, made Packed infer Ordered

Brian Fiete 5 years ago
parent
commit
cf7914f71a
2 changed files with 16 additions and 1 deletions
  1. 5 1
      IDEHelper/Compiler/BfModuleTypeUtils.cpp
  2. 11 0
      IDEHelper/Tests/src/Structs.bf

+ 5 - 1
IDEHelper/Compiler/BfModuleTypeUtils.cpp

@@ -2146,6 +2146,8 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
 	bool isCRepr = false;
 	bool isCRepr = false;
 	bool isOrdered = false;
 	bool isOrdered = false;
 	ProcessTypeInstCustomAttributes(isPacked, isUnion, isCRepr, isOrdered);
 	ProcessTypeInstCustomAttributes(isPacked, isUnion, isCRepr, isOrdered);
+	if (isPacked) // Packed infers ordered
+		isOrdered = true;
 	typeInstance->mIsUnion = isUnion;
 	typeInstance->mIsUnion = isUnion;
 	if ((typeInstance->IsEnum()) && (typeInstance->IsStruct()))
 	if ((typeInstance->IsEnum()) && (typeInstance->IsStruct()))
 		typeInstance->mIsUnion = true;
 		typeInstance->mIsUnion = true;
@@ -2783,7 +2785,9 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
 
 
 			bool needsExplicitAlignment = !isCRepr || resolvedFieldType->NeedsExplicitAlignment();
 			bool needsExplicitAlignment = !isCRepr || resolvedFieldType->NeedsExplicitAlignment();
 
 
-			int nextDataPos = (dataPos + (alignSize - 1)) & ~(alignSize - 1);
+			int nextDataPos = dataPos;
+			if (!isPacked)
+				nextDataPos = (dataPos + (alignSize - 1)) & ~(alignSize - 1);
 			int padding = nextDataPos - dataPos;
 			int padding = nextDataPos - dataPos;
 			if ((alignSize > 1) && (needsExplicitAlignment) && (padding > 0))
 			if ((alignSize > 1) && (needsExplicitAlignment) && (padding > 0))
 			{				
 			{				

+ 11 - 0
IDEHelper/Tests/src/Structs.bf

@@ -111,6 +111,13 @@ namespace Tests
 			int8 mD;
 			int8 mD;
 		}
 		}
 
 
+		[Packed]
+		struct StructJ
+		{
+			int8 mA;
+			int32 mB;
+		}
+
 		[Test]
 		[Test]
 		static void TestBasics()
 		static void TestBasics()
 		{
 		{
@@ -153,6 +160,10 @@ namespace Tests
 			Test.Assert(sizeof(StructI) == 16);
 			Test.Assert(sizeof(StructI) == 16);
 			Test.Assert(alignof(StructI) == 4);
 			Test.Assert(alignof(StructI) == 4);
 			Test.Assert(strideof(StructI) == 16);
 			Test.Assert(strideof(StructI) == 16);
+
+			Test.Assert(sizeof(StructJ) == 5);
+			Test.Assert(alignof(StructJ) == 1);
+			Test.Assert(strideof(StructJ) == 5);
 		}
 		}
 
 
 		public int Test<T>(T val)
 		public int Test<T>(T val)