aboutsummaryrefslogtreecommitdiff
path: root/src/type.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-07-27 14:06:42 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-07-27 14:19:53 -0700
commita8e964eadd3496330043985cacaaee7db92886c6 (patch)
tree57768a2f87b76b9f80231ab924d2bdb481a22d2a /src/type.zig
parentba71b96fe6c0e01b8445a2f7bd49541a07c360db (diff)
downloadzig-a8e964eadd3496330043985cacaaee7db92886c6.tar.gz
zig-a8e964eadd3496330043985cacaaee7db92886c6.zip
stage2: `zig test` now works with the LLVM backend
Frontend improvements: * When compiling in `zig test` mode, put a task on the work queue to analyze the main package root file. Normally, start code does `_ = import("root");` to make Zig analyze the user's code, however in the case of `zig test`, the root source file is the test runner. Without this change, no tests are picked up. * In the main pipeline, once semantic analysis is finished, if there are no compile errors, populate the `test_functions` Decl with the set of test functions picked up from semantic analysis. * Value: add `array` and `slice` Tags. LLVM backend improvements: * Fix incremental updates of globals. Previously the value of a global would not get replaced with a new value. * Fix LLVM type of arrays. They were incorrectly sending the ABI size as the element count. * Remove the FuncGen parameter from genTypedValue. This function is for generating global constants and there is no function available when it is being called. - The `ref_val` case is now commented out. I'd like to eliminate `ref_val` as one of the possible Value Tags. Instead it should always be done via `decl_ref`. * Implement constant value generation for slices, arrays, and structs. * Constant value generation for functions supports the `decl_ref` tag.
Diffstat (limited to 'src/type.zig')
-rw-r--r--src/type.zig22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/type.zig b/src/type.zig
index 731c69b806..4dd1a15fdd 100644
--- a/src/type.zig
+++ b/src/type.zig
@@ -1526,6 +1526,8 @@ pub const Type = extern union {
.var_args_param => unreachable,
.@"struct" => {
+ const s = self.castTag(.@"struct").?.data;
+ assert(s.status == .have_layout);
@panic("TODO abiSize struct");
},
.enum_simple, .enum_full, .enum_nonexhaustive => {
@@ -2768,6 +2770,26 @@ pub const Type = extern union {
}
}
+ pub fn structFieldCount(ty: Type) usize {
+ switch (ty.tag()) {
+ .@"struct" => {
+ const struct_obj = ty.castTag(.@"struct").?.data;
+ return struct_obj.fields.count();
+ },
+ else => unreachable,
+ }
+ }
+
+ pub fn structFieldType(ty: Type, index: usize) Type {
+ switch (ty.tag()) {
+ .@"struct" => {
+ const struct_obj = ty.castTag(.@"struct").?.data;
+ return struct_obj.fields.values()[index].ty;
+ },
+ else => unreachable,
+ }
+ }
+
pub fn declSrcLoc(ty: Type) Module.SrcLoc {
switch (ty.tag()) {
.enum_full, .enum_nonexhaustive => {