Przeglądaj źródła

Merge pull request #5408 from slowhei/master

Fix bug where compiler treats uint enums as ints
Jeroen van Rijn 1 miesiąc temu
rodzic
commit
88c208d1fb
2 zmienionych plików z 37 dodań i 0 usunięć
  1. 3 0
      src/types.cpp
  2. 34 0
      tests/internal/test_signedness_comparisons.odin

+ 3 - 0
src/types.cpp

@@ -1248,6 +1248,9 @@ gb_internal bool is_type_unsigned(Type *t) {
 	if (t->kind == Type_Basic) {
 		return (t->Basic.flags & BasicFlag_Unsigned) != 0;
 	}
+	if (t->kind == Type_Enum) {
+		return (t->Enum.base_type->Basic.flags & BasicFlag_Unsigned) != 0;
+	}
 	return false;
 }
 gb_internal bool is_type_integer_128bit(Type *t) {

+ 34 - 0
tests/internal/test_signedness_comparisons.odin

@@ -0,0 +1,34 @@
+package test_internal
+
+import "core:testing"
+
+@test
+test_comparisons_5408 :: proc(t: ^testing.T) {
+	// See: https://github.com/odin-lang/Odin/pull/5408
+	test_proc :: proc(lhs: $T, rhs: T) -> bool {
+		return lhs > rhs
+	}
+
+	Test_Enum :: enum u32 {
+		SMALL_VALUE = 0xFF,
+		BIG_VALUE   = 0xFF00_0000, // negative if interpreted as i32
+	}
+
+	testing.expect_value(t, test_proc(Test_Enum.SMALL_VALUE, Test_Enum.BIG_VALUE), false)
+	testing.expect_value(t, test_proc(Test_Enum(0xF), Test_Enum.BIG_VALUE),        false)
+	testing.expect_value(t, test_proc(Test_Enum(0xF), Test_Enum(0xF000_0000)),     false)
+	testing.expect_value(t, test_proc(Test_Enum.SMALL_VALUE, max(Test_Enum)),      false)
+	testing.expect_value(t, test_proc(Test_Enum(0xF), max(Test_Enum)),             false)
+}
+
+test_signedness :: proc(t: ^testing.T) {
+	{
+		a, b := i16(32767), i16(0)
+		testing.expect_value(t, a > b, true)
+	}
+
+	{
+		a, b := u16(65535), u16(0)
+		testing.expect_value(t, a > b, true)
+	}
+}