2020-05-18 16:45:06 +01:00
|
|
|
const builtin = @import("builtin");
|
|
|
|
|
2021-07-24 06:23:03 +01:00
|
|
|
test {
|
stage2: type system treats fn ptr and body separately
This commit updates stage2 to enforce the property that the syntax
`fn()void` is a function *body* not a *pointer*. To get a pointer, the
syntax `*const fn()void` is required.
ZIR puts function alignment into the func instruction rather than the
decl because this way it makes it into function types. LLVM backend
respects function alignments.
Struct and Union have methods `fieldSrcLoc` to help look up source
locations of their fields. These trigger full loading, tokenization, and
parsing of source files, so should only be called once it is confirmed
that an error message needs to be printed.
There are some nice new error hints for explaining why a type is
required to be comptime, particularly for structs that contain function
body types.
`Type.requiresComptime` is now moved into Sema because it can fail and
might need to trigger field type resolution. Comptime pointer loading
takes into account types that do not have a well-defined memory layout
and does not try to compute a byte offset for them.
`fn()void` syntax no longer secretly makes a pointer. You get a function
body type, which requires comptime. However a pointer to a function body
can be runtime known (obviously).
Compile errors that report "expected pointer, found ..." are factored
out into convenience functions `checkPtrOperand` and `checkPtrType` and
have a note about function pointers.
Implemented `Value.hash` for functions, enum literals, and undefined values.
stage1 is not updated to this (yet?), so some workarounds and disabled
tests are needed to keep everything working. Should we update stage1 to
these new type semantics? Yes probably because I don't want to add too
much conditional compilation logic in the std lib for the different
backends.
2022-01-21 07:49:58 +00:00
|
|
|
_ = @import("behavior/align.zig");
|
2022-01-23 19:19:14 +00:00
|
|
|
_ = @import("behavior/alignof.zig");
|
stage2: type system treats fn ptr and body separately
This commit updates stage2 to enforce the property that the syntax
`fn()void` is a function *body* not a *pointer*. To get a pointer, the
syntax `*const fn()void` is required.
ZIR puts function alignment into the func instruction rather than the
decl because this way it makes it into function types. LLVM backend
respects function alignments.
Struct and Union have methods `fieldSrcLoc` to help look up source
locations of their fields. These trigger full loading, tokenization, and
parsing of source files, so should only be called once it is confirmed
that an error message needs to be printed.
There are some nice new error hints for explaining why a type is
required to be comptime, particularly for structs that contain function
body types.
`Type.requiresComptime` is now moved into Sema because it can fail and
might need to trigger field type resolution. Comptime pointer loading
takes into account types that do not have a well-defined memory layout
and does not try to compute a byte offset for them.
`fn()void` syntax no longer secretly makes a pointer. You get a function
body type, which requires comptime. However a pointer to a function body
can be runtime known (obviously).
Compile errors that report "expected pointer, found ..." are factored
out into convenience functions `checkPtrOperand` and `checkPtrType` and
have a note about function pointers.
Implemented `Value.hash` for functions, enum literals, and undefined values.
stage1 is not updated to this (yet?), so some workarounds and disabled
tests are needed to keep everything working. Should we update stage1 to
these new type semantics? Yes probably because I don't want to add too
much conditional compilation logic in the std lib for the different
backends.
2022-01-21 07:49:58 +00:00
|
|
|
_ = @import("behavior/array.zig");
|
2022-03-23 21:06:07 +00:00
|
|
|
_ = @import("behavior/async_fn.zig");
|
2022-03-15 22:09:23 +00:00
|
|
|
_ = @import("behavior/atomics.zig");
|
2022-03-23 21:06:07 +00:00
|
|
|
_ = @import("behavior/await_struct.zig");
|
2022-02-08 21:35:34 +00:00
|
|
|
_ = @import("behavior/basic.zig");
|
2022-01-23 19:19:14 +00:00
|
|
|
_ = @import("behavior/bit_shifting.zig");
|
2022-02-22 12:52:40 +00:00
|
|
|
_ = @import("behavior/bitcast.zig");
|
2022-02-15 17:45:25 +00:00
|
|
|
_ = @import("behavior/bitreverse.zig");
|
stage2: type system treats fn ptr and body separately
This commit updates stage2 to enforce the property that the syntax
`fn()void` is a function *body* not a *pointer*. To get a pointer, the
syntax `*const fn()void` is required.
ZIR puts function alignment into the func instruction rather than the
decl because this way it makes it into function types. LLVM backend
respects function alignments.
Struct and Union have methods `fieldSrcLoc` to help look up source
locations of their fields. These trigger full loading, tokenization, and
parsing of source files, so should only be called once it is confirmed
that an error message needs to be printed.
There are some nice new error hints for explaining why a type is
required to be comptime, particularly for structs that contain function
body types.
`Type.requiresComptime` is now moved into Sema because it can fail and
might need to trigger field type resolution. Comptime pointer loading
takes into account types that do not have a well-defined memory layout
and does not try to compute a byte offset for them.
`fn()void` syntax no longer secretly makes a pointer. You get a function
body type, which requires comptime. However a pointer to a function body
can be runtime known (obviously).
Compile errors that report "expected pointer, found ..." are factored
out into convenience functions `checkPtrOperand` and `checkPtrType` and
have a note about function pointers.
Implemented `Value.hash` for functions, enum literals, and undefined values.
stage1 is not updated to this (yet?), so some workarounds and disabled
tests are needed to keep everything working. Should we update stage1 to
these new type semantics? Yes probably because I don't want to add too
much conditional compilation logic in the std lib for the different
backends.
2022-01-21 07:49:58 +00:00
|
|
|
_ = @import("behavior/bool.zig");
|
2024-08-26 22:25:47 +01:00
|
|
|
_ = @import("behavior/builtin_functions_returning_void_or_noreturn.zig");
|
2022-03-23 21:06:07 +00:00
|
|
|
_ = @import("behavior/byteswap.zig");
|
|
|
|
_ = @import("behavior/byval_arg_var.zig");
|
2022-02-22 13:15:09 +00:00
|
|
|
_ = @import("behavior/call.zig");
|
2023-07-27 01:21:33 +01:00
|
|
|
_ = @import("behavior/call_tail.zig");
|
stage2: type system treats fn ptr and body separately
This commit updates stage2 to enforce the property that the syntax
`fn()void` is a function *body* not a *pointer*. To get a pointer, the
syntax `*const fn()void` is required.
ZIR puts function alignment into the func instruction rather than the
decl because this way it makes it into function types. LLVM backend
respects function alignments.
Struct and Union have methods `fieldSrcLoc` to help look up source
locations of their fields. These trigger full loading, tokenization, and
parsing of source files, so should only be called once it is confirmed
that an error message needs to be printed.
There are some nice new error hints for explaining why a type is
required to be comptime, particularly for structs that contain function
body types.
`Type.requiresComptime` is now moved into Sema because it can fail and
might need to trigger field type resolution. Comptime pointer loading
takes into account types that do not have a well-defined memory layout
and does not try to compute a byte offset for them.
`fn()void` syntax no longer secretly makes a pointer. You get a function
body type, which requires comptime. However a pointer to a function body
can be runtime known (obviously).
Compile errors that report "expected pointer, found ..." are factored
out into convenience functions `checkPtrOperand` and `checkPtrType` and
have a note about function pointers.
Implemented `Value.hash` for functions, enum literals, and undefined values.
stage1 is not updated to this (yet?), so some workarounds and disabled
tests are needed to keep everything working. Should we update stage1 to
these new type semantics? Yes probably because I don't want to add too
much conditional compilation logic in the std lib for the different
backends.
2022-01-21 07:49:58 +00:00
|
|
|
_ = @import("behavior/cast.zig");
|
2022-03-18 22:02:52 +00:00
|
|
|
_ = @import("behavior/cast_int.zig");
|
stage2: type system treats fn ptr and body separately
This commit updates stage2 to enforce the property that the syntax
`fn()void` is a function *body* not a *pointer*. To get a pointer, the
syntax `*const fn()void` is required.
ZIR puts function alignment into the func instruction rather than the
decl because this way it makes it into function types. LLVM backend
respects function alignments.
Struct and Union have methods `fieldSrcLoc` to help look up source
locations of their fields. These trigger full loading, tokenization, and
parsing of source files, so should only be called once it is confirmed
that an error message needs to be printed.
There are some nice new error hints for explaining why a type is
required to be comptime, particularly for structs that contain function
body types.
`Type.requiresComptime` is now moved into Sema because it can fail and
might need to trigger field type resolution. Comptime pointer loading
takes into account types that do not have a well-defined memory layout
and does not try to compute a byte offset for them.
`fn()void` syntax no longer secretly makes a pointer. You get a function
body type, which requires comptime. However a pointer to a function body
can be runtime known (obviously).
Compile errors that report "expected pointer, found ..." are factored
out into convenience functions `checkPtrOperand` and `checkPtrType` and
have a note about function pointers.
Implemented `Value.hash` for functions, enum literals, and undefined values.
stage1 is not updated to this (yet?), so some workarounds and disabled
tests are needed to keep everything working. Should we update stage1 to
these new type semantics? Yes probably because I don't want to add too
much conditional compilation logic in the std lib for the different
backends.
2022-01-21 07:49:58 +00:00
|
|
|
_ = @import("behavior/comptime_memory.zig");
|
2022-03-15 22:09:23 +00:00
|
|
|
_ = @import("behavior/const_slice_child.zig");
|
2024-08-31 02:20:12 +01:00
|
|
|
_ = @import("behavior/decl_literals.zig");
|
2022-12-07 02:06:48 +00:00
|
|
|
_ = @import("behavior/decltest.zig");
|
2023-05-08 08:59:06 +01:00
|
|
|
_ = @import("behavior/duplicated_test_names.zig");
|
2022-02-22 13:15:09 +00:00
|
|
|
_ = @import("behavior/defer.zig");
|
compiler: implement destructuring syntax
This change implements the following syntax into the compiler:
```zig
const x: u32, var y, foo.bar = .{ 1, 2, 3 };
```
A destructure expression may only appear within a block (i.e. not at
comtainer scope). The LHS consists of a sequence of comma-separated var
decls and/or lvalue expressions. The RHS is a normal expression.
A new result location type, `destructure`, is used, which contains
result pointers for each component of the destructure. This means that
when the RHS is a more complicated expression, peer type resolution is
not used: each result value is individually destructured and written to
the result pointers. RLS is always used for destructure expressions,
meaning every `const` on the LHS of such an expression creates a true
stack allocation.
Aside from anonymous array literals, Sema is capable of destructuring
the following types:
* Tuples
* Arrays
* Vectors
A destructure may be prefixed with the `comptime` keyword, in which case
the entire destructure is evaluated at comptime: this means all `var`s
in the LHS are `comptime var`s, every lvalue expression is evaluated at
comptime, and the RHS is evaluated at comptime. If every LHS is a
`const`, this is not allowed: as with single declarations, the user
should instead mark the RHS as `comptime`.
There are a few subtleties in the grammar changes here. For one thing,
if every LHS is an lvalue expression (rather than a var decl), a
destructure is considered an expression. This makes, for instance,
`if (cond) x, y = .{ 1, 2 };` valid Zig code. A destructure is allowed
in almost every context where a standard assignment expression is
permitted. The exception is `switch` prongs, which cannot be
destructures as the comma is ambiguous with the end of the prong.
A follow-up commit will begin utilizing this syntax in the Zig compiler.
Resolves: #498
2023-08-31 14:30:58 +01:00
|
|
|
_ = @import("behavior/destructure.zig");
|
2022-12-07 02:06:48 +00:00
|
|
|
_ = @import("behavior/empty_union.zig");
|
2022-02-22 13:15:09 +00:00
|
|
|
_ = @import("behavior/enum.zig");
|
|
|
|
_ = @import("behavior/error.zig");
|
2022-03-18 22:02:52 +00:00
|
|
|
_ = @import("behavior/eval.zig");
|
2023-10-27 20:41:24 +01:00
|
|
|
_ = @import("behavior/export_builtin.zig");
|
2023-06-15 18:30:00 +01:00
|
|
|
_ = @import("behavior/export_self_referential_type_info.zig");
|
2024-01-11 00:56:38 +00:00
|
|
|
_ = @import("behavior/extern.zig");
|
2022-03-09 17:26:48 +00:00
|
|
|
_ = @import("behavior/field_parent_ptr.zig");
|
2022-03-03 00:28:39 +00:00
|
|
|
_ = @import("behavior/floatop.zig");
|
2022-03-23 21:06:07 +00:00
|
|
|
_ = @import("behavior/fn.zig");
|
2022-02-13 04:35:29 +00:00
|
|
|
_ = @import("behavior/fn_delegation.zig");
|
2022-01-05 22:51:26 +00:00
|
|
|
_ = @import("behavior/fn_in_struct_in_comptime.zig");
|
2022-02-22 13:15:09 +00:00
|
|
|
_ = @import("behavior/for.zig");
|
|
|
|
_ = @import("behavior/generics.zig");
|
2023-10-27 20:19:03 +01:00
|
|
|
_ = @import("behavior/globals.zig");
|
2022-01-05 22:51:26 +00:00
|
|
|
_ = @import("behavior/hasdecl.zig");
|
2022-01-06 22:23:29 +00:00
|
|
|
_ = @import("behavior/hasfield.zig");
|
2022-02-22 13:15:09 +00:00
|
|
|
_ = @import("behavior/if.zig");
|
|
|
|
_ = @import("behavior/import.zig");
|
2024-01-02 12:59:22 +00:00
|
|
|
_ = @import("behavior/import_c_keywords.zig");
|
2022-02-22 13:15:09 +00:00
|
|
|
_ = @import("behavior/incomplete_struct_param_tld.zig");
|
2022-12-07 02:06:48 +00:00
|
|
|
_ = @import("behavior/inline_switch.zig");
|
2022-03-18 22:02:52 +00:00
|
|
|
_ = @import("behavior/int128.zig");
|
2022-11-14 23:56:59 +00:00
|
|
|
_ = @import("behavior/int_comparison_elision.zig");
|
2023-06-15 08:14:16 +01:00
|
|
|
_ = @import("behavior/ptrfromint.zig");
|
2022-02-13 04:35:29 +00:00
|
|
|
_ = @import("behavior/ir_block_deps.zig");
|
2022-12-13 21:55:59 +00:00
|
|
|
_ = @import("behavior/lower_strlit_to_vector.zig");
|
2022-03-03 08:23:50 +00:00
|
|
|
_ = @import("behavior/math.zig");
|
2022-03-18 22:02:52 +00:00
|
|
|
_ = @import("behavior/maximum_minimum.zig");
|
2022-02-22 13:15:09 +00:00
|
|
|
_ = @import("behavior/member_func.zig");
|
2023-04-27 22:01:16 +01:00
|
|
|
_ = @import("behavior/memcpy.zig");
|
2023-04-26 20:49:32 +01:00
|
|
|
_ = @import("behavior/memset.zig");
|
2022-03-09 17:26:48 +00:00
|
|
|
_ = @import("behavior/merge_error_sets.zig");
|
2022-03-02 06:46:57 +00:00
|
|
|
_ = @import("behavior/muladd.zig");
|
2024-01-02 15:33:41 +00:00
|
|
|
_ = @import("behavior/multiple_externs_with_conflicting_types.zig");
|
2022-01-23 19:19:14 +00:00
|
|
|
_ = @import("behavior/namespace_depends_on_compile_var.zig");
|
2023-10-27 20:37:16 +01:00
|
|
|
_ = @import("behavior/nan.zig");
|
2022-02-22 13:15:09 +00:00
|
|
|
_ = @import("behavior/null.zig");
|
2022-02-10 01:19:03 +00:00
|
|
|
_ = @import("behavior/optional.zig");
|
2022-12-07 02:06:48 +00:00
|
|
|
_ = @import("behavior/packed-struct.zig");
|
|
|
|
_ = @import("behavior/packed_struct_explicit_backing_int.zig");
|
2023-07-29 10:51:33 +01:00
|
|
|
_ = @import("behavior/packed-union.zig");
|
2022-02-22 13:15:09 +00:00
|
|
|
_ = @import("behavior/pointers.zig");
|
2022-03-18 22:02:52 +00:00
|
|
|
_ = @import("behavior/popcount.zig");
|
2022-03-02 06:46:57 +00:00
|
|
|
_ = @import("behavior/prefetch.zig");
|
2022-02-22 13:15:09 +00:00
|
|
|
_ = @import("behavior/ptrcast.zig");
|
2022-03-02 06:46:57 +00:00
|
|
|
_ = @import("behavior/pub_enum.zig");
|
2022-02-22 13:15:09 +00:00
|
|
|
_ = @import("behavior/ref_var_in_if_after_if_2nd_switch_prong.zig");
|
2022-03-02 06:46:57 +00:00
|
|
|
_ = @import("behavior/reflection.zig");
|
2023-03-17 02:40:47 +00:00
|
|
|
_ = @import("behavior/return_address.zig");
|
2022-03-18 22:02:52 +00:00
|
|
|
_ = @import("behavior/saturating_arithmetic.zig");
|
2022-03-23 21:06:07 +00:00
|
|
|
_ = @import("behavior/select.zig");
|
2022-03-18 22:02:52 +00:00
|
|
|
_ = @import("behavior/shuffle.zig");
|
2022-03-09 17:26:48 +00:00
|
|
|
_ = @import("behavior/sizeof_and_typeof.zig");
|
|
|
|
_ = @import("behavior/slice.zig");
|
2022-03-18 22:02:52 +00:00
|
|
|
_ = @import("behavior/slice_sentinel_comptime.zig");
|
2022-02-22 13:15:09 +00:00
|
|
|
_ = @import("behavior/src.zig");
|
2023-10-24 01:06:44 +01:00
|
|
|
_ = @import("behavior/string_literals.zig");
|
2022-03-02 06:46:57 +00:00
|
|
|
_ = @import("behavior/struct.zig");
|
2022-03-18 22:02:52 +00:00
|
|
|
_ = @import("behavior/struct_contains_null_ptr_itself.zig");
|
2022-03-22 07:23:54 +00:00
|
|
|
_ = @import("behavior/struct_contains_slice_of_itself.zig");
|
2022-03-18 22:02:52 +00:00
|
|
|
_ = @import("behavior/switch.zig");
|
2024-04-28 21:44:57 +01:00
|
|
|
_ = @import("behavior/switch_loop.zig");
|
2022-03-09 17:26:48 +00:00
|
|
|
_ = @import("behavior/switch_prong_err_enum.zig");
|
|
|
|
_ = @import("behavior/switch_prong_implicit_cast.zig");
|
2024-05-11 10:06:13 +01:00
|
|
|
_ = @import("behavior/switch_on_captured_error.zig");
|
2022-02-22 13:15:09 +00:00
|
|
|
_ = @import("behavior/this.zig");
|
2022-12-07 04:48:48 +00:00
|
|
|
_ = @import("behavior/threadlocal.zig");
|
2022-02-13 04:35:29 +00:00
|
|
|
_ = @import("behavior/truncate.zig");
|
2022-02-22 13:15:09 +00:00
|
|
|
_ = @import("behavior/try.zig");
|
2022-02-13 04:35:29 +00:00
|
|
|
_ = @import("behavior/tuple.zig");
|
2022-12-07 02:06:48 +00:00
|
|
|
_ = @import("behavior/tuple_declarations.zig");
|
2022-02-13 04:35:29 +00:00
|
|
|
_ = @import("behavior/type.zig");
|
2022-02-22 13:15:09 +00:00
|
|
|
_ = @import("behavior/type_info.zig");
|
2023-11-25 11:39:37 +00:00
|
|
|
_ = @import("behavior/type_info_mul_linksection_addrspace_decls.zig");
|
2022-03-18 07:12:22 +00:00
|
|
|
_ = @import("behavior/typename.zig");
|
2022-02-22 13:15:09 +00:00
|
|
|
_ = @import("behavior/undefined.zig");
|
|
|
|
_ = @import("behavior/underscore.zig");
|
|
|
|
_ = @import("behavior/union.zig");
|
2022-03-18 22:02:52 +00:00
|
|
|
_ = @import("behavior/union_with_members.zig");
|
2022-02-22 13:15:09 +00:00
|
|
|
_ = @import("behavior/usingnamespace.zig");
|
2022-02-13 04:35:29 +00:00
|
|
|
_ = @import("behavior/var_args.zig");
|
2022-03-17 06:54:25 +00:00
|
|
|
_ = @import("behavior/vector.zig");
|
2022-02-22 13:15:09 +00:00
|
|
|
_ = @import("behavior/void.zig");
|
|
|
|
_ = @import("behavior/while.zig");
|
2022-03-18 22:02:52 +00:00
|
|
|
_ = @import("behavior/widening.zig");
|
2023-07-18 00:52:14 +01:00
|
|
|
_ = @import("behavior/abs.zig");
|
2021-04-29 22:51:21 +01:00
|
|
|
|
2022-07-25 03:05:20 +01:00
|
|
|
if (builtin.cpu.arch == .wasm32) {
|
2022-03-03 18:16:30 +00:00
|
|
|
_ = @import("behavior/wasm.zig");
|
|
|
|
}
|
|
|
|
|
2022-03-23 21:06:07 +00:00
|
|
|
if (builtin.os.tag != .wasi) {
|
2022-03-20 21:04:28 +00:00
|
|
|
_ = @import("behavior/asm.zig");
|
2022-03-23 21:06:07 +00:00
|
|
|
}
|
|
|
|
|
2022-02-22 13:15:09 +00:00
|
|
|
if (builtin.zig_backend != .stage2_arm and
|
|
|
|
builtin.zig_backend != .stage2_aarch64 and
|
2023-05-11 06:53:34 +01:00
|
|
|
builtin.zig_backend != .stage2_spirv64)
|
2022-02-22 13:15:09 +00:00
|
|
|
{
|
2023-10-27 20:41:24 +01:00
|
|
|
_ = @import("behavior/export_keyword.zig");
|
2022-07-05 23:46:12 +01:00
|
|
|
}
|
2019-01-30 02:47:26 +00:00
|
|
|
}
|
2024-02-21 15:21:14 +00:00
|
|
|
|
|
|
|
// This bug only repros in the root file
|
|
|
|
test "deference @embedFile() of a file full of zero bytes" {
|
|
|
|
const contents = @embedFile("behavior/zero.bin").*;
|
|
|
|
try @import("std").testing.expect(contents.len == 456);
|
|
|
|
for (contents) |byte| try @import("std").testing.expect(byte == 0);
|
|
|
|
}
|