mirror of
https://github.com/ziglang/zig.git
synced 2025-12-24 23:23:07 +00:00
The big change in this commit is making `semaDecl` resolve the fields if
the Decl ends up being a struct or union. It needs to do this while
the `Sema` is still in scope, because it will have the resolved AIR
instructions that the field type expressions possibly reference. We do
this after the decl is populated and set to `complete` so that a `Decl`
may reference itself.
Everything else is fixes and improvements to make the test suite pass
again after making this change.
* New AIR instruction: `ptr_elem_ptr`
- Implemented for LLVM backend
* New Type tag: `type_info` which represents `std.builtin.TypeInfo`. It
is used by AstGen for the operand type of `@Type`.
* ZIR instruction `set_float_mode` uses `coerced_ty` to avoid
superfluous `as` instruction on operand.
* ZIR instruction `Type` uses `coerced_ty` to properly handle result
location type of operand.
* Fix two instances of `enum_nonexhaustive` Value Tag not handled
properly - it should generally be handled the same as `enum_full`.
* Fix struct and union field resolution not copying Type and Value
objects into its Decl arena.
* Fix enum tag value resolution discarding the ZIR=>AIR instruction map
for the child Sema, when they still needed to be accessed.
* Fix `zirResolveInferredAlloc` use-after-free in the AIR instructions
data array.
* Fix `elemPtrArray` not respecting const/mutable attribute of pointer
in the result type.
* Fix LLVM backend crashing when `updateDeclExports` is called before
`updateDecl`/`updateFunc` (which is, according to the API, perfectly
legal for the frontend to do).
* Fix LLVM backend handling element pointer of pointer-to-array. It
needed another index in the GEP otherwise LLVM saw the wrong type.
* Fix LLVM test cases not returning 0 from main, causing test failures.
Fixes a regression introduced in
6a5094872f10acc629543cc7f10533b438d0283a.
* Implement comptime shift-right.
* Implement `@Type` for integers and `@TypeInfo` for integers.
* Implement union initialization syntax.
* Implement `zirFieldType` for unions.
* Implement `elemPtrArray` for a runtime-known operand.
* Make `zirLog2IntType` support RHS of shift being `comptime_int`. In
this case it returns `comptime_int`.
The motivating test case for this commit was originally:
```zig
test "example" {
var l: List(10) = undefined;
l.array[1] = 1;
}
fn List(comptime L: usize) type {
var T = u8;
return struct {
array: [L]T,
};
}
```
However I changed it to:
```zig
test "example" {
var l: List = undefined;
l.array[1] = 1;
}
const List = blk: {
const T = [10]u8;
break :blk struct {
array: T,
};
};
```
Which ended up being a similar, smaller problem. The former test case
will require a similar solution in the implementation of comptime
function calls - checking if the result of the function call is a struct
or union, and using the child `Sema` before it is destroyed to resolve
the fields.
161 lines
7.1 KiB
Zig
161 lines
7.1 KiB
Zig
const builtin = @import("builtin");
|
|
|
|
test {
|
|
// Tests that pass for both.
|
|
_ = @import("behavior/bool.zig");
|
|
_ = @import("behavior/basic.zig");
|
|
_ = @import("behavior/generics.zig");
|
|
_ = @import("behavior/eval.zig");
|
|
_ = @import("behavior/pointers.zig");
|
|
_ = @import("behavior/if.zig");
|
|
_ = @import("behavior/cast.zig");
|
|
_ = @import("behavior/array.zig");
|
|
|
|
if (!builtin.zig_is_stage2) {
|
|
// Tests that only pass for stage1.
|
|
_ = @import("behavior/align.zig");
|
|
_ = @import("behavior/alignof.zig");
|
|
_ = @import("behavior/array_stage1.zig");
|
|
if (builtin.os.tag != .wasi) {
|
|
_ = @import("behavior/asm.zig");
|
|
_ = @import("behavior/async_fn.zig");
|
|
}
|
|
_ = @import("behavior/atomics.zig");
|
|
_ = @import("behavior/await_struct.zig");
|
|
_ = @import("behavior/bit_shifting.zig");
|
|
_ = @import("behavior/bitcast.zig");
|
|
_ = @import("behavior/bitreverse.zig");
|
|
_ = @import("behavior/bugs/1025.zig");
|
|
_ = @import("behavior/bugs/1076.zig");
|
|
_ = @import("behavior/bugs/1111.zig");
|
|
_ = @import("behavior/bugs/1120.zig");
|
|
_ = @import("behavior/bugs/1277.zig");
|
|
_ = @import("behavior/bugs/1310.zig");
|
|
_ = @import("behavior/bugs/1322.zig");
|
|
_ = @import("behavior/bugs/1381.zig");
|
|
_ = @import("behavior/bugs/1421.zig");
|
|
_ = @import("behavior/bugs/1442.zig");
|
|
_ = @import("behavior/bugs/1486.zig");
|
|
_ = @import("behavior/bugs/1500.zig");
|
|
_ = @import("behavior/bugs/1607.zig");
|
|
_ = @import("behavior/bugs/1735.zig");
|
|
_ = @import("behavior/bugs/1741.zig");
|
|
_ = @import("behavior/bugs/1851.zig");
|
|
_ = @import("behavior/bugs/1914.zig");
|
|
_ = @import("behavior/bugs/2006.zig");
|
|
_ = @import("behavior/bugs/2114.zig");
|
|
_ = @import("behavior/bugs/2346.zig");
|
|
_ = @import("behavior/bugs/2578.zig");
|
|
_ = @import("behavior/bugs/2692.zig");
|
|
_ = @import("behavior/bugs/2889.zig");
|
|
_ = @import("behavior/bugs/3007.zig");
|
|
_ = @import("behavior/bugs/3046.zig");
|
|
_ = @import("behavior/bugs/3112.zig");
|
|
_ = @import("behavior/bugs/3367.zig");
|
|
_ = @import("behavior/bugs/3384.zig");
|
|
_ = @import("behavior/bugs/3586.zig");
|
|
_ = @import("behavior/bugs/3742.zig");
|
|
_ = @import("behavior/bugs/3779.zig");
|
|
_ = @import("behavior/bugs/4328.zig");
|
|
_ = @import("behavior/bugs/4560.zig");
|
|
_ = @import("behavior/bugs/4769_a.zig");
|
|
_ = @import("behavior/bugs/4769_b.zig");
|
|
_ = @import("behavior/bugs/4954.zig");
|
|
_ = @import("behavior/bugs/5398.zig");
|
|
_ = @import("behavior/bugs/5413.zig");
|
|
_ = @import("behavior/bugs/5474.zig");
|
|
_ = @import("behavior/bugs/5487.zig");
|
|
_ = @import("behavior/bugs/6456.zig");
|
|
_ = @import("behavior/bugs/6781.zig");
|
|
_ = @import("behavior/bugs/6850.zig");
|
|
_ = @import("behavior/bugs/7027.zig");
|
|
_ = @import("behavior/bugs/7047.zig");
|
|
_ = @import("behavior/bugs/7003.zig");
|
|
_ = @import("behavior/bugs/7250.zig");
|
|
_ = @import("behavior/bugs/9584.zig");
|
|
_ = @import("behavior/bugs/394.zig");
|
|
_ = @import("behavior/bugs/421.zig");
|
|
_ = @import("behavior/bugs/529.zig");
|
|
_ = @import("behavior/bugs/624.zig");
|
|
_ = @import("behavior/bugs/655.zig");
|
|
_ = @import("behavior/bugs/656.zig");
|
|
_ = @import("behavior/bugs/679.zig");
|
|
_ = @import("behavior/bugs/704.zig");
|
|
_ = @import("behavior/bugs/718.zig");
|
|
_ = @import("behavior/bugs/726.zig");
|
|
_ = @import("behavior/bugs/828.zig");
|
|
_ = @import("behavior/bugs/920.zig");
|
|
_ = @import("behavior/byteswap.zig");
|
|
_ = @import("behavior/byval_arg_var.zig");
|
|
_ = @import("behavior/call.zig");
|
|
_ = @import("behavior/cast_stage1.zig");
|
|
_ = @import("behavior/const_slice_child.zig");
|
|
_ = @import("behavior/defer.zig");
|
|
_ = @import("behavior/enum.zig");
|
|
_ = @import("behavior/enum_with_members.zig");
|
|
_ = @import("behavior/error.zig");
|
|
_ = @import("behavior/eval_stage1.zig");
|
|
_ = @import("behavior/field_parent_ptr.zig");
|
|
_ = @import("behavior/floatop.zig");
|
|
_ = @import("behavior/fn.zig");
|
|
_ = @import("behavior/fn_in_struct_in_comptime.zig");
|
|
_ = @import("behavior/fn_delegation.zig");
|
|
_ = @import("behavior/for.zig");
|
|
_ = @import("behavior/generics_stage1.zig");
|
|
_ = @import("behavior/hasdecl.zig");
|
|
_ = @import("behavior/hasfield.zig");
|
|
_ = @import("behavior/if_stage1.zig");
|
|
_ = @import("behavior/import.zig");
|
|
_ = @import("behavior/incomplete_struct_param_tld.zig");
|
|
_ = @import("behavior/inttoptr.zig");
|
|
_ = @import("behavior/ir_block_deps.zig");
|
|
_ = @import("behavior/math.zig");
|
|
_ = @import("behavior/maximum_minimum.zig");
|
|
_ = @import("behavior/merge_error_sets.zig");
|
|
_ = @import("behavior/misc.zig");
|
|
_ = @import("behavior/muladd.zig");
|
|
_ = @import("behavior/namespace_depends_on_compile_var.zig");
|
|
_ = @import("behavior/null.zig");
|
|
_ = @import("behavior/optional.zig");
|
|
_ = @import("behavior/pointers_stage1.zig");
|
|
_ = @import("behavior/popcount.zig");
|
|
_ = @import("behavior/ptrcast.zig");
|
|
_ = @import("behavior/pub_enum.zig");
|
|
_ = @import("behavior/ref_var_in_if_after_if_2nd_switch_prong.zig");
|
|
_ = @import("behavior/reflection.zig");
|
|
_ = @import("behavior/shuffle.zig");
|
|
_ = @import("behavior/select.zig");
|
|
_ = @import("behavior/sizeof_and_typeof.zig");
|
|
_ = @import("behavior/slice.zig");
|
|
_ = @import("behavior/slice_sentinel_comptime.zig");
|
|
_ = @import("behavior/struct.zig");
|
|
_ = @import("behavior/struct_contains_null_ptr_itself.zig");
|
|
_ = @import("behavior/struct_contains_slice_of_itself.zig");
|
|
_ = @import("behavior/switch.zig");
|
|
_ = @import("behavior/switch_prong_err_enum.zig");
|
|
_ = @import("behavior/switch_prong_implicit_cast.zig");
|
|
_ = @import("behavior/syntax.zig");
|
|
_ = @import("behavior/this.zig");
|
|
_ = @import("behavior/truncate.zig");
|
|
_ = @import("behavior/try.zig");
|
|
_ = @import("behavior/tuple.zig");
|
|
_ = @import("behavior/type.zig");
|
|
_ = @import("behavior/type_info.zig");
|
|
_ = @import("behavior/typename.zig");
|
|
_ = @import("behavior/undefined.zig");
|
|
_ = @import("behavior/underscore.zig");
|
|
_ = @import("behavior/union.zig");
|
|
_ = @import("behavior/usingnamespace.zig");
|
|
_ = @import("behavior/var_args.zig");
|
|
_ = @import("behavior/vector.zig");
|
|
_ = @import("behavior/void.zig");
|
|
if (builtin.target.cpu.arch == .wasm32) {
|
|
_ = @import("behavior/wasm.zig");
|
|
}
|
|
_ = @import("behavior/while.zig");
|
|
_ = @import("behavior/widening.zig");
|
|
_ = @import("behavior/src.zig");
|
|
_ = @import("behavior/translate_c_macros.zig");
|
|
}
|
|
}
|