mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
Basic support for incomplete types. (#3302)
Incomplete types may be nested within other types; for example, a tuple type might have an incomplete type as an element. Handle such cases by walking through nested incomplete types when completing a type. This is done non-recursively in case a very complex type is formed. Types are generally no longer completed at the point where they're formed. Instead, we attempt to complete a type when it is used in a context that requires a complete type, and diagnose if the type cannot be completed at that point. This will be necessary for classes, which can become complete after their first use, and helps tease out bugs where a type completeness check is missing.
This commit is contained in:
+30
-31
@@ -21,35 +21,34 @@ var a: [i32; 9] = (1, 2, 3, 4, 5, 6, 7, 8, 9);
|
||||
// CHECK:STDOUT: %.loc7_41: i32 = int_literal 8
|
||||
// CHECK:STDOUT: %.loc7_44: i32 = int_literal 9
|
||||
// CHECK:STDOUT: %.loc7_45.1: type = tuple_type (i32, i32, i32, i32, i32, i32, i32, i32, i32)
|
||||
// CHECK:STDOUT: %.loc7_45.2: type = ptr_type (i32, i32, i32, i32, i32, i32, i32, i32, i32)
|
||||
// CHECK:STDOUT: %.loc7_45.3: (i32, i32, i32, i32, i32, i32, i32, i32, i32) = tuple_literal (%.loc7_20, %.loc7_23, %.loc7_26, %.loc7_29, %.loc7_32, %.loc7_35, %.loc7_38, %.loc7_41, %.loc7_44)
|
||||
// CHECK:STDOUT: %.loc7_45.4: i32 = int_literal 0
|
||||
// CHECK:STDOUT: %.loc7_45.5: ref i32 = array_index %a, %.loc7_45.4
|
||||
// CHECK:STDOUT: %.loc7_45.6: init i32 = initialize_from %.loc7_20 to %.loc7_45.5
|
||||
// CHECK:STDOUT: %.loc7_45.7: i32 = int_literal 1
|
||||
// CHECK:STDOUT: %.loc7_45.8: ref i32 = array_index %a, %.loc7_45.7
|
||||
// CHECK:STDOUT: %.loc7_45.9: init i32 = initialize_from %.loc7_23 to %.loc7_45.8
|
||||
// CHECK:STDOUT: %.loc7_45.10: i32 = int_literal 2
|
||||
// CHECK:STDOUT: %.loc7_45.11: ref i32 = array_index %a, %.loc7_45.10
|
||||
// CHECK:STDOUT: %.loc7_45.12: init i32 = initialize_from %.loc7_26 to %.loc7_45.11
|
||||
// CHECK:STDOUT: %.loc7_45.13: i32 = int_literal 3
|
||||
// CHECK:STDOUT: %.loc7_45.14: ref i32 = array_index %a, %.loc7_45.13
|
||||
// CHECK:STDOUT: %.loc7_45.15: init i32 = initialize_from %.loc7_29 to %.loc7_45.14
|
||||
// CHECK:STDOUT: %.loc7_45.16: i32 = int_literal 4
|
||||
// CHECK:STDOUT: %.loc7_45.17: ref i32 = array_index %a, %.loc7_45.16
|
||||
// CHECK:STDOUT: %.loc7_45.18: init i32 = initialize_from %.loc7_32 to %.loc7_45.17
|
||||
// CHECK:STDOUT: %.loc7_45.19: i32 = int_literal 5
|
||||
// CHECK:STDOUT: %.loc7_45.20: ref i32 = array_index %a, %.loc7_45.19
|
||||
// CHECK:STDOUT: %.loc7_45.21: init i32 = initialize_from %.loc7_35 to %.loc7_45.20
|
||||
// CHECK:STDOUT: %.loc7_45.22: i32 = int_literal 6
|
||||
// CHECK:STDOUT: %.loc7_45.23: ref i32 = array_index %a, %.loc7_45.22
|
||||
// CHECK:STDOUT: %.loc7_45.24: init i32 = initialize_from %.loc7_38 to %.loc7_45.23
|
||||
// CHECK:STDOUT: %.loc7_45.25: i32 = int_literal 7
|
||||
// CHECK:STDOUT: %.loc7_45.26: ref i32 = array_index %a, %.loc7_45.25
|
||||
// CHECK:STDOUT: %.loc7_45.27: init i32 = initialize_from %.loc7_41 to %.loc7_45.26
|
||||
// CHECK:STDOUT: %.loc7_45.28: i32 = int_literal 8
|
||||
// CHECK:STDOUT: %.loc7_45.29: ref i32 = array_index %a, %.loc7_45.28
|
||||
// CHECK:STDOUT: %.loc7_45.30: init i32 = initialize_from %.loc7_44 to %.loc7_45.29
|
||||
// CHECK:STDOUT: %.loc7_45.31: init [i32; 9] = array_init %.loc7_45.3, (%.loc7_45.6, %.loc7_45.9, %.loc7_45.12, %.loc7_45.15, %.loc7_45.18, %.loc7_45.21, %.loc7_45.24, %.loc7_45.27, %.loc7_45.30) to %a
|
||||
// CHECK:STDOUT: assign %a, %.loc7_45.31
|
||||
// CHECK:STDOUT: %.loc7_45.2: (i32, i32, i32, i32, i32, i32, i32, i32, i32) = tuple_literal (%.loc7_20, %.loc7_23, %.loc7_26, %.loc7_29, %.loc7_32, %.loc7_35, %.loc7_38, %.loc7_41, %.loc7_44)
|
||||
// CHECK:STDOUT: %.loc7_45.3: i32 = int_literal 0
|
||||
// CHECK:STDOUT: %.loc7_45.4: ref i32 = array_index %a, %.loc7_45.3
|
||||
// CHECK:STDOUT: %.loc7_45.5: init i32 = initialize_from %.loc7_20 to %.loc7_45.4
|
||||
// CHECK:STDOUT: %.loc7_45.6: i32 = int_literal 1
|
||||
// CHECK:STDOUT: %.loc7_45.7: ref i32 = array_index %a, %.loc7_45.6
|
||||
// CHECK:STDOUT: %.loc7_45.8: init i32 = initialize_from %.loc7_23 to %.loc7_45.7
|
||||
// CHECK:STDOUT: %.loc7_45.9: i32 = int_literal 2
|
||||
// CHECK:STDOUT: %.loc7_45.10: ref i32 = array_index %a, %.loc7_45.9
|
||||
// CHECK:STDOUT: %.loc7_45.11: init i32 = initialize_from %.loc7_26 to %.loc7_45.10
|
||||
// CHECK:STDOUT: %.loc7_45.12: i32 = int_literal 3
|
||||
// CHECK:STDOUT: %.loc7_45.13: ref i32 = array_index %a, %.loc7_45.12
|
||||
// CHECK:STDOUT: %.loc7_45.14: init i32 = initialize_from %.loc7_29 to %.loc7_45.13
|
||||
// CHECK:STDOUT: %.loc7_45.15: i32 = int_literal 4
|
||||
// CHECK:STDOUT: %.loc7_45.16: ref i32 = array_index %a, %.loc7_45.15
|
||||
// CHECK:STDOUT: %.loc7_45.17: init i32 = initialize_from %.loc7_32 to %.loc7_45.16
|
||||
// CHECK:STDOUT: %.loc7_45.18: i32 = int_literal 5
|
||||
// CHECK:STDOUT: %.loc7_45.19: ref i32 = array_index %a, %.loc7_45.18
|
||||
// CHECK:STDOUT: %.loc7_45.20: init i32 = initialize_from %.loc7_35 to %.loc7_45.19
|
||||
// CHECK:STDOUT: %.loc7_45.21: i32 = int_literal 6
|
||||
// CHECK:STDOUT: %.loc7_45.22: ref i32 = array_index %a, %.loc7_45.21
|
||||
// CHECK:STDOUT: %.loc7_45.23: init i32 = initialize_from %.loc7_38 to %.loc7_45.22
|
||||
// CHECK:STDOUT: %.loc7_45.24: i32 = int_literal 7
|
||||
// CHECK:STDOUT: %.loc7_45.25: ref i32 = array_index %a, %.loc7_45.24
|
||||
// CHECK:STDOUT: %.loc7_45.26: init i32 = initialize_from %.loc7_41 to %.loc7_45.25
|
||||
// CHECK:STDOUT: %.loc7_45.27: i32 = int_literal 8
|
||||
// CHECK:STDOUT: %.loc7_45.28: ref i32 = array_index %a, %.loc7_45.27
|
||||
// CHECK:STDOUT: %.loc7_45.29: init i32 = initialize_from %.loc7_44 to %.loc7_45.28
|
||||
// CHECK:STDOUT: %.loc7_45.30: init [i32; 9] = array_init %.loc7_45.2, (%.loc7_45.5, %.loc7_45.8, %.loc7_45.11, %.loc7_45.14, %.loc7_45.17, %.loc7_45.20, %.loc7_45.23, %.loc7_45.26, %.loc7_45.29) to %a
|
||||
// CHECK:STDOUT: assign %a, %.loc7_45.30
|
||||
// CHECK:STDOUT: }
|
||||
|
||||
Reference in New Issue
Block a user