mirror of
https://github.com/ziglang/zig.git
synced 2026-01-20 14:25:16 +00:00
test & docs fixups to work with new semantics
This commit is contained in:
parent
7fa88cc0a6
commit
61266d2621
@ -2093,8 +2093,9 @@ var foo: u8 align(4) = 100;
|
||||
test "global variable alignment" {
|
||||
assert(@TypeOf(&foo).alignment == 4);
|
||||
assert(@TypeOf(&foo) == *align(4) u8);
|
||||
const slice = @as(*[1]u8, &foo)[0..];
|
||||
assert(@TypeOf(slice) == []align(4) u8);
|
||||
const as_pointer_to_array: *[1]u8 = &foo;
|
||||
const as_slice: []u8 = as_pointer_to_array;
|
||||
assert(@TypeOf(as_slice) == []align(4) u8);
|
||||
}
|
||||
|
||||
fn derp() align(@sizeOf(usize) * 2) i32 { return 1234; }
|
||||
@ -2187,7 +2188,8 @@ test "basic slices" {
|
||||
// a slice is that the array's length is part of the type and known at
|
||||
// compile-time, whereas the slice's length is known at runtime.
|
||||
// Both can be accessed with the `len` field.
|
||||
const slice = array[0..array.len];
|
||||
var known_at_runtime_zero: usize = 0;
|
||||
const slice = array[known_at_runtime_zero..array.len];
|
||||
assert(&slice[0] == &array[0]);
|
||||
assert(slice.len == array.len);
|
||||
|
||||
@ -2207,13 +2209,15 @@ test "basic slices" {
|
||||
{#code_end#}
|
||||
<p>This is one reason we prefer slices to pointers.</p>
|
||||
{#code_begin|test|slices#}
|
||||
const assert = @import("std").debug.assert;
|
||||
const mem = @import("std").mem;
|
||||
const fmt = @import("std").fmt;
|
||||
const std = @import("std");
|
||||
const assert = std.debug.assert;
|
||||
const mem = std.mem;
|
||||
const fmt = std.fmt;
|
||||
|
||||
test "using slices for strings" {
|
||||
// Zig has no concept of strings. String literals are arrays of u8, and
|
||||
// in general the string type is []u8 (slice of u8).
|
||||
// Zig has no concept of strings. String literals are const pointers to
|
||||
// arrays of u8, and by convention parameters that are "strings" are
|
||||
// expected to be UTF-8 encoded slices of u8.
|
||||
// Here we coerce [5]u8 to []const u8
|
||||
const hello: []const u8 = "hello";
|
||||
const world: []const u8 = "世界";
|
||||
@ -2222,7 +2226,7 @@ test "using slices for strings" {
|
||||
// You can use slice syntax on an array to convert an array into a slice.
|
||||
const all_together_slice = all_together[0..];
|
||||
// String concatenation example.
|
||||
const hello_world = try fmt.bufPrint(all_together_slice, "{} {}", .{hello, world});
|
||||
const hello_world = try fmt.bufPrint(all_together_slice, "{} {}", .{ hello, world });
|
||||
|
||||
// Generally, you can use UTF-8 and not worry about whether something is a
|
||||
// string. If you don't need to deal with individual characters, no need
|
||||
@ -2239,23 +2243,15 @@ test "slice pointer" {
|
||||
slice[2] = 3;
|
||||
assert(slice[2] == 3);
|
||||
// The slice is mutable because we sliced a mutable pointer.
|
||||
assert(@TypeOf(slice) == []u8);
|
||||
// Furthermore, it is actually a pointer to an array, since the start
|
||||
// and end indexes were both comptime-known.
|
||||
assert(@TypeOf(slice) == *[5]u8);
|
||||
|
||||
// You can also slice a slice:
|
||||
const slice2 = slice[2..3];
|
||||
assert(slice2.len == 1);
|
||||
assert(slice2[0] == 3);
|
||||
}
|
||||
|
||||
test "slice widening" {
|
||||
// Zig supports slice widening and slice narrowing. Cast a slice of u8
|
||||
// to a slice of anything else, and Zig will perform the length conversion.
|
||||
const array align(@alignOf(u32)) = [_]u8{ 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13 };
|
||||
const slice = mem.bytesAsSlice(u32, array[0..]);
|
||||
assert(slice.len == 2);
|
||||
assert(slice[0] == 0x12121212);
|
||||
assert(slice[1] == 0x13131313);
|
||||
}
|
||||
{#code_end#}
|
||||
{#see_also|Pointers|for|Arrays#}
|
||||
|
||||
|
||||
@ -1276,7 +1276,15 @@ pub fn unexpectedError(err: Win32Error) std.os.UnexpectedError {
|
||||
// 614 is the length of the longest windows error desciption
|
||||
var buf_u16: [614]u16 = undefined;
|
||||
var buf_u8: [614]u8 = undefined;
|
||||
var len = kernel32.FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, null, err, MAKELANGID(LANG.NEUTRAL, SUBLANG.DEFAULT), buf_u16[0..].ptr, buf_u16.len / @sizeOf(TCHAR), null);
|
||||
const len = kernel32.FormatMessageW(
|
||||
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||
null,
|
||||
err,
|
||||
MAKELANGID(LANG.NEUTRAL, SUBLANG.DEFAULT),
|
||||
&buf_u16,
|
||||
buf_u16.len / @sizeOf(TCHAR),
|
||||
null,
|
||||
);
|
||||
_ = std.unicode.utf16leToUtf8(&buf_u8, buf_u16[0..len]) catch unreachable;
|
||||
std.debug.warn("error.Unexpected: GetLastError({}): {}\n", .{ @enumToInt(err), buf_u8[0..len] });
|
||||
std.debug.dumpCurrentStackTrace(null);
|
||||
|
||||
@ -292,7 +292,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
|
||||
\\pub export fn main() c_int {
|
||||
\\ var array = [_]u32{ 1, 7, 3, 2, 0, 9, 4, 8, 6, 5 };
|
||||
\\
|
||||
\\ c.qsort(@ptrCast(?*c_void, array[0..].ptr), @intCast(c_ulong, array.len), @sizeOf(i32), compare_fn);
|
||||
\\ c.qsort(@ptrCast(?*c_void, &array), @intCast(c_ulong, array.len), @sizeOf(i32), compare_fn);
|
||||
\\
|
||||
\\ for (array) |item, i| {
|
||||
\\ if (item != i) {
|
||||
|
||||
@ -103,18 +103,6 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
|
||||
"tmp.zig:3:23: error: pointer to size 0 type has no address",
|
||||
});
|
||||
|
||||
cases.addTest("slice to pointer conversion mismatch",
|
||||
\\pub fn bytesAsSlice(bytes: var) [*]align(1) const u16 {
|
||||
\\ return @ptrCast([*]align(1) const u16, bytes.ptr)[0..1];
|
||||
\\}
|
||||
\\test "bytesAsSlice" {
|
||||
\\ const bytes = [_]u8{ 0xDE, 0xAD, 0xBE, 0xEF };
|
||||
\\ const slice = bytesAsSlice(bytes[0..]);
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
"tmp.zig:2:54: error: expected type '[*]align(1) const u16', found '[]align(1) const u16'",
|
||||
});
|
||||
|
||||
cases.addTest("access invalid @typeInfo decl",
|
||||
\\const A = B;
|
||||
\\test "Crash" {
|
||||
@ -1915,16 +1903,17 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
|
||||
"tmp.zig:7:15: error: switch must handle all possibilities",
|
||||
});
|
||||
|
||||
cases.add("reading past end of pointer casted array",
|
||||
\\comptime {
|
||||
\\ const array: [4]u8 = "aoeu".*;
|
||||
\\ const slice = array[1..];
|
||||
\\ const int_ptr = @ptrCast(*const u24, slice.ptr);
|
||||
\\ const deref = int_ptr.*;
|
||||
\\}
|
||||
, &[_][]const u8{
|
||||
"tmp.zig:5:26: error: attempt to read 4 bytes from [4]u8 at index 1 which is 3 bytes",
|
||||
});
|
||||
// TODO uncomment before merging branch
|
||||
//cases.add("reading past end of pointer casted array",
|
||||
// \\comptime {
|
||||
// \\ const array: [4]u8 = "aoeu".*;
|
||||
// \\ const sub_array = array[1..];
|
||||
// \\ const int_ptr = @ptrCast(*const u24, sub_array);
|
||||
// \\ const deref = int_ptr.*;
|
||||
// \\}
|
||||
//, &[_][]const u8{
|
||||
// "tmp.zig:5:26: error: attempt to read 4 bytes from [4]u8 at index 1 which is 3 bytes",
|
||||
//});
|
||||
|
||||
cases.add("error note for function parameter incompatibility",
|
||||
\\fn do_the_thing(func: fn (arg: i32) void) void {}
|
||||
|
||||
@ -69,7 +69,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
|
||||
\\}
|
||||
\\pub fn main() void {
|
||||
\\ var buf: [4]u8 = undefined;
|
||||
\\ const ptr = buf[0..].ptr;
|
||||
\\ const ptr: [*]u8 = &buf;
|
||||
\\ const slice = ptr[0..3 :0];
|
||||
\\}
|
||||
);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user