Browse Source

fix another type alias issue with mini cycle

Laytan Laats 2 months ago
parent
commit
478c923e2c
4 changed files with 32 additions and 2 deletions
  1. 6 2
      src/check_type.cpp
  2. 1 0
      tests/issues/run.bat
  3. 1 0
      tests/issues/run.sh
  4. 24 0
      tests/issues/test_issue_5097-2.odin

+ 6 - 2
src/check_type.cpp

@@ -3805,7 +3805,11 @@ gb_internal Type *check_type_expr(CheckerContext *ctx, Ast *e, Type *named_type)
 		#if 0
 		error(e, "Invalid type definition of '%.*s'", LIT(type->Named.name));
 		#endif
-		type->Named.base = t_invalid;
+		if (type->Named.type_name->TypeName.is_type_alias) {
+			// NOTE(laytan): keep it null, type declaration is a mini "cycle" to be filled later.
+		} else {
+			type->Named.base = t_invalid;
+		}
 	}
 
 	if (is_type_polymorphic(type)) {
@@ -3823,7 +3827,7 @@ gb_internal Type *check_type_expr(CheckerContext *ctx, Ast *e, Type *named_type)
 	}
 	#endif
 
-	if (is_type_typed(type)) {
+	if (type->kind == Type_Named && type->Named.base == nullptr || is_type_typed(type)) {
 		add_type_and_value(ctx, e, Addressing_Type, type, empty_exact_value);
 	} else {
 		gbString name = type_to_string(type);

+ 1 - 0
tests/issues/run.bat

@@ -19,6 +19,7 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style
 ..\..\..\odin test ..\test_issue_4584.odin %COMMON%  || exit /b
 ..\..\..\odin build ..\test_issue_5043.odin %COMMON% || exit /b
 ..\..\..\odin build ..\test_issue_5097.odin %COMMON% || exit /b
+..\..\..\odin build ..\test_issue_5097-2.odin %COMMON% || exit /b
 
 @echo off
 

+ 1 - 0
tests/issues/run.sh

@@ -26,6 +26,7 @@ else
 fi
 $ODIN build ../test_issue_5043.odin $COMMON
 $ODIN build ../test_issue_5097.odin $COMMON
+$ODIN build ../test_issue_5097-2.odin $COMMON
 
 set +x
 

+ 24 - 0
tests/issues/test_issue_5097-2.odin

@@ -0,0 +1,24 @@
+// Tests another variation of, this should compile #5097 https://github.com/odin-lang/Odin/issues/5097
+package test_issues
+
+Face      :: ^FaceRec
+GlyphSlot :: ^GlyphSlotRec
+Size      :: ^SizeRec
+
+SizeRec :: struct {
+    face: Face,
+}
+
+GlyphSlotRec :: struct {
+    face: Face,
+}
+
+FaceRec :: struct {
+    glyph: GlyphSlot,
+    size:  Size,
+}
+
+main :: proc() {
+    face: Face
+	_ = face
+}