authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-04-07 14:24:50-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-04-07 14:24:50-04:00
log87a7ea4c420ca0db0e13fab82ce08ab4e293d1da
treefed7d84fc1ce023c47f3b4a8f77b898b4396c111
parent1ee59c5c31efca394d7e6d9da3f64c289a996b99
parent95fefcd4c91e517a51f4b55924979421c6f7e8d3
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #4971 from Vexu/const-ref

Fix missing const on address of literal

9 files changed, 62 insertions(+), 31 deletions(-)

lib/std/json.zig+6-5
...@@ -1327,12 +1327,13 @@ test "Value.jsonStringify" {...@@ -1327,12 +1327,13 @@ test "Value.jsonStringify" {
1327 {1327 {
1328 var buffer: [10]u8 = undefined;1328 var buffer: [10]u8 = undefined;
1329 var fbs = std.io.fixedBufferStream(&buffer);1329 var fbs = std.io.fixedBufferStream(&buffer);
1330 var vals = [_]Value{
1331 .{ .Integer = 1 },
1332 .{ .Integer = 2 },
1333 .{ .Integer = 3 },
1334 };
1330 try (Value{1335 try (Value{
1331 .Array = Array.fromOwnedSlice(undefined, &[_]Value{1336 .Array = Array.fromOwnedSlice(undefined, &vals),
1332 .{ .Integer = 1 },
1333 .{ .Integer = 2 },
1334 .{ .Integer = 3 },
1335 }),
1336 }).jsonStringify(.{}, fbs.outStream());1337 }).jsonStringify(.{}, fbs.outStream());
1337 testing.expectEqualSlices(u8, fbs.getWritten(), "[1,2,3]");1338 testing.expectEqualSlices(u8, fbs.getWritten(), "[1,2,3]");
1338 }1339 }
lib/std/testing.zig+2-1
...@@ -7,7 +7,8 @@ pub const FailingAllocator = @import("testing/failing_allocator.zig").FailingAll...@@ -7,7 +7,8 @@ pub const FailingAllocator = @import("testing/failing_allocator.zig").FailingAll
7pub const allocator = &allocator_instance.allocator;7pub const allocator = &allocator_instance.allocator;
8pub var allocator_instance = LeakCountAllocator.init(&base_allocator_instance.allocator);8pub var allocator_instance = LeakCountAllocator.init(&base_allocator_instance.allocator);
99
10pub const failing_allocator = &FailingAllocator.init(&base_allocator_instance.allocator, 0).allocator;10pub const failing_allocator = &failing_allocator_instance.allocator;
11pub var failing_allocator_instance = FailingAllocator.init(&base_allocator_instance.allocator, 0);
1112
12pub var base_allocator_instance = std.heap.ThreadSafeFixedBufferAllocator.init(allocator_mem[0..]);13pub var base_allocator_instance = std.heap.ThreadSafeFixedBufferAllocator.init(allocator_mem[0..]);
13var allocator_mem: [1024 * 1024]u8 = undefined;14var allocator_mem: [1024 * 1024]u8 = undefined;
src/all_types.hpp-2
...@@ -3519,8 +3519,6 @@ struct IrInstSrcRef {...@@ -3519,8 +3519,6 @@ struct IrInstSrcRef {
3519 IrInstSrc base;3519 IrInstSrc base;
35203520
3521 IrInstSrc *value;3521 IrInstSrc *value;
3522 bool is_const;
3523 bool is_volatile;
3524};3522};
35253523
3526struct IrInstGenRef {3524struct IrInstGenRef {
src/ir.cpp+13-8
...@@ -3290,13 +3290,9 @@ static IrInstSrc *ir_build_import(IrBuilderSrc *irb, Scope *scope, AstNode *sour...@@ -3290,13 +3290,9 @@ static IrInstSrc *ir_build_import(IrBuilderSrc *irb, Scope *scope, AstNode *sour
3290 return &instruction->base;3290 return &instruction->base;
3291}3291}
32923292
3293static IrInstSrc *ir_build_ref_src(IrBuilderSrc *irb, Scope *scope, AstNode *source_node, IrInstSrc *value,3293static IrInstSrc *ir_build_ref_src(IrBuilderSrc *irb, Scope *scope, AstNode *source_node, IrInstSrc *value) {
3294 bool is_const, bool is_volatile)
3295{
3296 IrInstSrcRef *instruction = ir_build_instruction<IrInstSrcRef>(irb, scope, source_node);3294 IrInstSrcRef *instruction = ir_build_instruction<IrInstSrcRef>(irb, scope, source_node);
3297 instruction->value = value;3295 instruction->value = value;
3298 instruction->is_const = is_const;
3299 instruction->is_volatile = is_volatile;
33003296
3301 ir_ref_instruction(value, irb->current_basic_block);3297 ir_ref_instruction(value, irb->current_basic_block);
33023298
...@@ -5938,7 +5934,7 @@ static IrInstSrc *ir_gen_symbol(IrBuilderSrc *irb, Scope *scope, AstNode *node,...@@ -5938,7 +5934,7 @@ static IrInstSrc *ir_gen_symbol(IrBuilderSrc *irb, Scope *scope, AstNode *node,
5938 } else {5934 } else {
5939 IrInstSrc *value = ir_build_const_type(irb, scope, node, primitive_type);5935 IrInstSrc *value = ir_build_const_type(irb, scope, node, primitive_type);
5940 if (lval == LValPtr) {5936 if (lval == LValPtr) {
5941 return ir_build_ref_src(irb, scope, node, value, false, false);5937 return ir_build_ref_src(irb, scope, node, value);
5942 } else {5938 } else {
5943 return ir_expr_wrap(irb, scope, value, result_loc);5939 return ir_expr_wrap(irb, scope, value, result_loc);
5944 }5940 }
...@@ -7486,7 +7482,7 @@ static IrInstSrc *ir_lval_wrap(IrBuilderSrc *irb, Scope *scope, IrInstSrc *value...@@ -7486,7 +7482,7 @@ static IrInstSrc *ir_lval_wrap(IrBuilderSrc *irb, Scope *scope, IrInstSrc *value
7486 if (lval == LValPtr) {7482 if (lval == LValPtr) {
7487 // We needed a pointer to a value, but we got a value. So we create7483 // We needed a pointer to a value, but we got a value. So we create
7488 // an instruction which just makes a pointer of it.7484 // an instruction which just makes a pointer of it.
7489 return ir_build_ref_src(irb, scope, value->base.source_node, value, false, false);7485 return ir_build_ref_src(irb, scope, value->base.source_node, value);
7490 } else if (result_loc != nullptr) {7486 } else if (result_loc != nullptr) {
7491 return ir_expr_wrap(irb, scope, value, result_loc);7487 return ir_expr_wrap(irb, scope, value, result_loc);
7492 } else {7488 } else {
...@@ -23348,7 +23344,16 @@ static IrInstGen *ir_analyze_instruction_ref(IrAnalyze *ira, IrInstSrcRef *ref_i...@@ -23348,7 +23344,16 @@ static IrInstGen *ir_analyze_instruction_ref(IrAnalyze *ira, IrInstSrcRef *ref_i
23348 IrInstGen *value = ref_instruction->value->child;23344 IrInstGen *value = ref_instruction->value->child;
23349 if (type_is_invalid(value->value->type))23345 if (type_is_invalid(value->value->type))
23350 return ira->codegen->invalid_inst_gen;23346 return ira->codegen->invalid_inst_gen;
23351 return ir_get_ref(ira, &ref_instruction->base.base, value, ref_instruction->is_const, ref_instruction->is_volatile);23347
23348 bool is_const = false;
23349 bool is_volatile = false;
23350
23351 ZigValue *child_value = value->value;
23352 if (child_value->special == ConstValSpecialStatic) {
23353 is_const = true;
23354 }
23355
23356 return ir_get_ref(ira, &ref_instruction->base.base, value, is_const, is_volatile);
23352}23357}
2335323358
23354static IrInstGen *ir_analyze_union_init(IrAnalyze *ira, IrInst* source_instruction,23359static IrInstGen *ir_analyze_union_init(IrAnalyze *ira, IrInst* source_instruction,
src/ir_print.cpp+1-3
...@@ -1476,9 +1476,7 @@ static void ir_print_import(IrPrintSrc *irp, IrInstSrcImport *instruction) {...@@ -1476,9 +1476,7 @@ static void ir_print_import(IrPrintSrc *irp, IrInstSrcImport *instruction) {
1476}1476}
14771477
1478static void ir_print_ref(IrPrintSrc *irp, IrInstSrcRef *instruction) {1478static void ir_print_ref(IrPrintSrc *irp, IrInstSrcRef *instruction) {
1479 const char *const_str = instruction->is_const ? "const " : "";1479 fprintf(irp->f, "ref ");
1480 const char *volatile_str = instruction->is_volatile ? "volatile " : "";
1481 fprintf(irp->f, "%s%sref ", const_str, volatile_str);
1482 ir_print_other_inst_src(irp, instruction->value);1480 ir_print_other_inst_src(irp, instruction->value);
1483}1481}
14841482
test/compile_errors.zig+33-5
...@@ -2,6 +2,34 @@ const tests = @import("tests.zig");...@@ -2,6 +2,34 @@ const tests = @import("tests.zig");
2const std = @import("std");2const std = @import("std");
33
4pub fn addCases(cases: *tests.CompileErrorContext) void {4pub fn addCases(cases: *tests.CompileErrorContext) void {
5 cases.addTest("reference to const data",
6 \\export fn foo() void {
7 \\ var ptr = &[_]u8{0,0,0,0};
8 \\ ptr[1] = 2;
9 \\}
10 \\export fn bar() void {
11 \\ var ptr = &@as(u32, 2);
12 \\ ptr.* = 2;
13 \\}
14 \\export fn baz() void {
15 \\ var ptr = &true;
16 \\ ptr.* = false;
17 \\}
18 \\export fn qux() void {
19 \\ const S = struct{
20 \\ x: usize,
21 \\ y: usize,
22 \\ };
23 \\ var ptr = &S{.x=1,.y=2};
24 \\ ptr.x = 2;
25 \\}
26 , &[_][]const u8{
27 "tmp.zig:3:14: error: cannot assign to constant",
28 "tmp.zig:7:13: error: cannot assign to constant",
29 "tmp.zig:11:13: error: cannot assign to constant",
30 "tmp.zig:19:13: error: cannot assign to constant",
31 });
32
5 cases.addTest("cast between ?T where T is not a pointer",33 cases.addTest("cast between ?T where T is not a pointer",
6 \\pub const fnty1 = ?fn (i8) void;34 \\pub const fnty1 = ?fn (i8) void;
7 \\pub const fnty2 = ?fn (u64) void;35 \\pub const fnty2 = ?fn (u64) void;
...@@ -969,7 +997,7 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {...@@ -969,7 +997,7 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
969 \\ const x = 1 << &@as(u8, 10);997 \\ const x = 1 << &@as(u8, 10);
970 \\}998 \\}
971 , &[_][]const u8{999 , &[_][]const u8{
972 "tmp.zig:2:21: error: shift amount has to be an integer type, but found '*u8'",1000 "tmp.zig:2:21: error: shift amount has to be an integer type, but found '*const u8'",
973 "tmp.zig:2:17: note: referenced here",1001 "tmp.zig:2:17: note: referenced here",
974 });1002 });
9751003
...@@ -978,7 +1006,7 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {...@@ -978,7 +1006,7 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
978 \\ const x = &@as(u8, 1) << 10;1006 \\ const x = &@as(u8, 1) << 10;
979 \\}1007 \\}
980 , &[_][]const u8{1008 , &[_][]const u8{
981 "tmp.zig:2:16: error: bit shifting operation expected integer type, found '*u8'",1009 "tmp.zig:2:16: error: bit shifting operation expected integer type, found '*const u8'",
982 "tmp.zig:2:27: note: referenced here",1010 "tmp.zig:2:27: note: referenced here",
983 });1011 });
9841012
...@@ -6005,7 +6033,7 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {...@@ -6005,7 +6033,7 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
6005 \\ fn bar(self: *const Foo) void {}6033 \\ fn bar(self: *const Foo) void {}
6006 \\};6034 \\};
6007 , &[_][]const u8{6035 , &[_][]const u8{
6008 "tmp.zig:2:4: error: variable of type '*comptime_int' must be const or comptime",6036 "tmp.zig:2:4: error: variable of type '*const comptime_int' must be const or comptime",
6009 "tmp.zig:5:4: error: variable of type '(undefined)' must be const or comptime",6037 "tmp.zig:5:4: error: variable of type '(undefined)' must be const or comptime",
6010 "tmp.zig:8:4: error: variable of type 'comptime_int' must be const or comptime",6038 "tmp.zig:8:4: error: variable of type 'comptime_int' must be const or comptime",
6011 "tmp.zig:11:4: error: variable of type 'comptime_float' must be const or comptime",6039 "tmp.zig:11:4: error: variable of type 'comptime_float' must be const or comptime",
...@@ -6849,12 +6877,12 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {...@@ -6849,12 +6877,12 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
6849 \\ const word: u16 = @bitCast(u16, bytes[0..]);6877 \\ const word: u16 = @bitCast(u16, bytes[0..]);
6850 \\}6878 \\}
6851 \\export fn foo2() void {6879 \\export fn foo2() void {
6852 \\ var bytes: []u8 = &[_]u8{1, 2};6880 \\ var bytes: []const u8 = &[_]u8{1, 2};
6853 \\ const word: u16 = @bitCast(u16, bytes);6881 \\ const word: u16 = @bitCast(u16, bytes);
6854 \\}6882 \\}
6855 , &[_][]const u8{6883 , &[_][]const u8{
6856 "tmp.zig:3:42: error: unable to @bitCast from pointer type '*[2]u8'",6884 "tmp.zig:3:42: error: unable to @bitCast from pointer type '*[2]u8'",
6857 "tmp.zig:7:32: error: destination type 'u16' has size 2 but source type '[]u8' has size 16",6885 "tmp.zig:7:32: error: destination type 'u16' has size 2 but source type '[]const u8' has size 16",
6858 "tmp.zig:7:37: note: referenced here",6886 "tmp.zig:7:37: note: referenced here",
6859 });6887 });
68606888
test/stage1/behavior/for.zig+2-2
...@@ -161,8 +161,8 @@ test "for copies its payload" {...@@ -161,8 +161,8 @@ test "for copies its payload" {
161161
162test "for on slice with allowzero ptr" {162test "for on slice with allowzero ptr" {
163 const S = struct {163 const S = struct {
164 fn doTheTest(slice: []u8) void {164 fn doTheTest(slice: []const u8) void {
165 var ptr = @ptrCast([*]allowzero u8, slice.ptr)[0..slice.len];165 var ptr = @ptrCast([*]const allowzero u8, slice.ptr)[0..slice.len];
166 for (ptr) |x, i| expect(x == i + 1);166 for (ptr) |x, i| expect(x == i + 1);
167 for (ptr) |*x, i| expect(x.* == i + 1);167 for (ptr) |*x, i| expect(x.* == i + 1);
168 }168 }
test/stage1/behavior/pointers.zig+3-3
...@@ -253,7 +253,7 @@ test "pointer sentinel with enums" {...@@ -253,7 +253,7 @@ test "pointer sentinel with enums" {
253 };253 };
254254
255 fn doTheTest() void {255 fn doTheTest() void {
256 var ptr: [*:.sentinel]Number = &[_:.sentinel]Number{ .one, .two, .two, .one };256 var ptr: [*:.sentinel]const Number = &[_:.sentinel]Number{ .one, .two, .two, .one };
257 expect(ptr[4] == .sentinel); // TODO this should be comptime expect, see #3731257 expect(ptr[4] == .sentinel); // TODO this should be comptime expect, see #3731
258 }258 }
259 };259 };
...@@ -264,7 +264,7 @@ test "pointer sentinel with enums" {...@@ -264,7 +264,7 @@ test "pointer sentinel with enums" {
264test "pointer sentinel with optional element" {264test "pointer sentinel with optional element" {
265 const S = struct {265 const S = struct {
266 fn doTheTest() void {266 fn doTheTest() void {
267 var ptr: [*:null]?i32 = &[_:null]?i32{ 1, 2, 3, 4 };267 var ptr: [*:null]const ?i32 = &[_:null]?i32{ 1, 2, 3, 4 };
268 expect(ptr[4] == null); // TODO this should be comptime expect, see #3731268 expect(ptr[4] == null); // TODO this should be comptime expect, see #3731
269 }269 }
270 };270 };
...@@ -276,7 +276,7 @@ test "pointer sentinel with +inf" {...@@ -276,7 +276,7 @@ test "pointer sentinel with +inf" {
276 const S = struct {276 const S = struct {
277 fn doTheTest() void {277 fn doTheTest() void {
278 const inf = std.math.inf_f32;278 const inf = std.math.inf_f32;
279 var ptr: [*:inf]f32 = &[_:inf]f32{ 1.1, 2.2, 3.3, 4.4 };279 var ptr: [*:inf]const f32 = &[_:inf]f32{ 1.1, 2.2, 3.3, 4.4 };
280 expect(ptr[4] == inf); // TODO this should be comptime expect, see #3731280 expect(ptr[4] == inf); // TODO this should be comptime expect, see #3731
281 }281 }
282 };282 };
test/stage1/behavior/slice.zig+2-2
...@@ -218,9 +218,9 @@ test "slice syntax resulting in pointer-to-array" {...@@ -218,9 +218,9 @@ test "slice syntax resulting in pointer-to-array" {
218 }218 }
219219
220 fn testPointer0() void {220 fn testPointer0() void {
221 var pointer: [*]u0 = &[1]u0{0};221 var pointer: [*]const u0 = &[1]u0{0};
222 var slice = pointer[0..1];222 var slice = pointer[0..1];
223 comptime expect(@TypeOf(slice) == *[1]u0);223 comptime expect(@TypeOf(slice) == *const [1]u0);
224 expect(slice[0] == 0);224 expect(slice[0] == 0);
225 }225 }
226226