authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-01-25 23:56:46-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-01-25 23:56:46-07:00
log4e439734130eadea4ef74cdb54a2496ecad6e8cd
tree0a87721ad11697108f7ab070ba31f335b1575e45
parentb215a3e0b6b3d79f4ffdaf3a092b8aa283aafb7b

variable initializations are now mandatory

use `undefined` if you want uninitialized memory

8 files changed, 29 insertions(+), 32 deletions(-)

doc/langref.md+1-1
......@@ -9,7 +9,7 @@ TopLevelDecl : FnDef | ExternBlock | RootExportDecl | Import | ContainerDecl | V
99
1010ErrorValueDecl : option(FnVisibleMod) "error" "Symbol"
1111
12VariableDeclaration : option(FnVisibleMod) ("var" | "const") "Symbol" ("=" Expression | ":" PrefixOpExpression option("=" Expression))
12VariableDeclaration : option(FnVisibleMod) ("var" | "const") "Symbol" option(":" PrefixOpExpression) "=" Expression
1313
1414ContainerDecl : many(Directive) option(FnVisibleMod) ("struct" | "enum") "Symbol" "{" many(StructMember) "}"
1515
example/cat/main.zig+3-4
......@@ -18,11 +18,10 @@ pub fn main(args: [][]u8) -> %void {
1818 } else if (arg[0] == '-') {
1919 return usage(exe);
2020 } else {
21 var is: InputStream;
22 is.open(arg, OpenReadOnly) %% |err| {
21 var is = input_stream_open(arg, OpenReadOnly) %% |err| {
2322 %%stderr.print("Unable to open file: {}", ([]u8)(err));
2423 return err;
25 }
24 };
2625 defer is.close();
2726
2827 catted_anything = true;
......@@ -40,7 +39,7 @@ fn usage(exe: []u8) -> %void {
4039}
4140
4241fn cat_stream(is: InputStream) -> %void {
43 var buf: [1024 * 4]u8;
42 var buf: [1024 * 4]u8 = undefined;
4443
4544 while (true) {
4645 const bytes_read = is.read(buf) %% |err| {
example/guess_number/main.zig+2-2
......@@ -6,7 +6,7 @@ import "rand.zig";
66pub fn main(args: [][]u8) -> %void {
77 %%stderr.print_str("Welcome to the Guess Number Game in Zig.\n");
88
9 var seed : u32;
9 var seed : u32 = undefined;
1010 const seed_bytes = (&u8)(&seed)[0...4];
1111 %%os_get_random_bytes(seed_bytes);
1212
......@@ -16,7 +16,7 @@ pub fn main(args: [][]u8) -> %void {
1616
1717 while (true) {
1818 %%stderr.print_str("\nGuess a number between 1 and 100: ");
19 var line_buf : [20]u8;
19 var line_buf : [20]u8 = undefined;
2020
2121 const line_len = stdin.read(line_buf) %% |err| {
2222 %%stderr.print_str("Unable to read from stdin.\n");
src/analyze.cpp+3-5
......@@ -2625,7 +2625,7 @@ static VariableTableEntry *analyze_variable_declaration_raw(CodeGen *g, ImportTa
26252625 }
26262626
26272627 TypeTableEntry *implicit_type = nullptr;
2628 if (variable_declaration->expr != nullptr) {
2628 if (variable_declaration->expr) {
26292629 implicit_type = analyze_expression(g, import, context, explicit_type, variable_declaration->expr);
26302630 if (implicit_type->id == TypeTableEntryIdInvalid) {
26312631 // ignore the poison value
......@@ -2657,10 +2657,8 @@ static VariableTableEntry *analyze_variable_declaration_raw(CodeGen *g, ImportTa
26572657 buf_sprintf("global variable initializer requires constant expression"));
26582658 }
26592659 }
2660 }
2661
2662 if (implicit_type == nullptr && is_const) {
2663 add_node_error(g, source_node, buf_sprintf("const variable missing initialization"));
2660 } else {
2661 add_node_error(g, source_node, buf_sprintf("variables must be initialized"));
26642662 implicit_type = g->builtin_types.entry_invalid;
26652663 }
26662664
std/bootstrap.zig+1-1
......@@ -24,7 +24,7 @@ fn strlen(ptr: &const u8) -> isize {
2424}
2525
2626fn call_main() -> unreachable {
27 var args: [argc][]u8;
27 var args: [argc][]u8 = undefined;
2828 for (arg, args, i) {
2929 const ptr = argv[i];
3030 args[i] = ptr[0...strlen(ptr)];
std/rand.zig+3-3
......@@ -27,7 +27,7 @@ pub struct Rand {
2727 pub fn get_bytes(r: &Rand, buf: []u8) {
2828 var bytes_left = r.get_bytes_aligned(buf);
2929 if (bytes_left > 0) {
30 var rand_val_array : [@sizeof(u32)]u8;
30 var rand_val_array : [@sizeof(u32)]u8 = undefined;
3131 *((&u32)(rand_val_array.ptr)) = r.get_u32();
3232 while (bytes_left > 0) {
3333 buf[buf.len - bytes_left] = rand_val_array[@sizeof(u32) - bytes_left];
......@@ -42,7 +42,7 @@ pub struct Rand {
4242 const range = end - start;
4343 const leftover = @max_value(u64) % range;
4444 const upper_bound = @max_value(u64) - leftover;
45 var rand_val_array : [@sizeof(u64)]u8;
45 var rand_val_array : [@sizeof(u64)]u8 = undefined;
4646
4747 while (true) {
4848 r.get_bytes_aligned(rand_val_array);
......@@ -79,7 +79,7 @@ pub struct Rand {
7979
8080/// Initialize random state with the given seed.
8181pub fn rand_new(seed: u32) -> Rand {
82 var r: Rand;
82 var r: Rand = undefined;
8383 r.index = 0;
8484 r.array[0] = seed;
8585 var i : isize = 1;
std/std.zig+1-1
......@@ -209,7 +209,7 @@ fn buf_print_i64(out_buf: []u8, x: i64) -> isize {
209209}
210210
211211fn buf_print_u64(out_buf: []u8, x: u64) -> isize {
212 var buf: [max_u64_base10_digits]u8;
212 var buf: [max_u64_base10_digits]u8 = undefined;
213213 var a = x;
214214 var index = buf.len;
215215
test/run_tests.cpp+15-15
......@@ -344,7 +344,7 @@ pub fn main(args: [][]u8) -> %void {
344344import "std.zig";
345345
346346pub fn main(args: [][]u8) -> %void {
347 var array: [4]void;
347 var array: [4]void = undefined;
348348 array[0] = void{};
349349 array[1] = array[2];
350350 if (@sizeof(@typeof(array)) != 0) {
......@@ -377,7 +377,7 @@ pub fn main(args: [][]u8) -> %void {
377377import "std.zig";
378378
379379pub fn main(args: [][]u8) -> %void {
380 var array : [5]i32;
380 var array : [5]i32 = undefined;
381381
382382 var i : i32 = 0;
383383 while (i < 5) {
......@@ -613,7 +613,7 @@ export fn main(argc: c_int, argv: &&u8) -> c_int {
613613import "std.zig";
614614
615615pub fn main(args: [][]u8) -> %void {
616 var foo : Foo;
616 var foo : Foo = undefined;
617617 @memset(&foo, 0, @sizeof(Foo));
618618 foo.a += 1;
619619 foo.b = foo.a == 1;
......@@ -649,10 +649,10 @@ struct Val {
649649 x: i32,
650650}
651651fn test_point_to_self() {
652 var root : Node;
652 var root : Node = undefined;
653653 root.val.x = 1;
654654
655 var node : Node;
655 var node : Node = undefined;
656656 node.next = &root;
657657 node.val.x = 2;
658658
......@@ -663,8 +663,8 @@ fn test_point_to_self() {
663663 }
664664}
665665fn test_byval_assign() {
666 var foo1 : Foo;
667 var foo2 : Foo;
666 var foo1 : Foo = undefined;
667 var foo2 : Foo = undefined;
668668
669669 foo1.a = 1234;
670670
......@@ -829,7 +829,7 @@ import "std.zig";
829829const ARRAY_SIZE : i8 = 20;
830830
831831pub fn main(args: [][]u8) -> %void {
832 var array : [ARRAY_SIZE]u8;
832 var array : [ARRAY_SIZE]u8 = undefined;
833833 %%stdout.print_u64(@sizeof(@typeof(array)));
834834 %%stdout.printf("\n");
835835}
......@@ -924,7 +924,7 @@ pub fn main(args: [][]u8) -> %void {
924924 add_simple_case("slicing", R"SOURCE(
925925import "std.zig";
926926pub fn main(args: [][]u8) -> %void {
927 var array : [20]i32;
927 var array : [20]i32 = undefined;
928928
929929 array[5] = 1234;
930930
......@@ -969,7 +969,7 @@ fn f(c: u8) -> u8 {
969969 add_simple_case("overflow intrinsics", R"SOURCE(
970970import "std.zig";
971971pub fn main(args: [][]u8) -> %void {
972 var result: u8;
972 var result: u8 = undefined;
973973 if (!@add_with_overflow(u8, 250, 100, &result)) {
974974 %%stdout.printf("BAD\n");
975975 }
......@@ -986,8 +986,8 @@ pub fn main(args: [][]u8) -> %void {
986986 add_simple_case("memcpy and memset intrinsics", R"SOURCE(
987987import "std.zig";
988988pub fn main(args: [][]u8) -> %void {
989 var foo : [20]u8;
990 var bar : [20]u8;
989 var foo : [20]u8 = undefined;
990 var bar : [20]u8 = undefined;
991991
992992 @memset(foo.ptr, 'A', foo.len);
993993 @memcpy(bar.ptr, foo.ptr, bar.len);
......@@ -1475,7 +1475,7 @@ fn f() {
14751475
14761476 add_compile_fail_case("array access errors", R"SOURCE(
14771477fn f() {
1478 var bad : bool;
1478 var bad : bool = undefined;
14791479 i[i] = i[i];
14801480 bad[bad] = bad[bad];
14811481}
......@@ -1521,7 +1521,7 @@ struct C { a : A, }
15211521 add_compile_fail_case("invalid struct field", R"SOURCE(
15221522struct A { x : i32, }
15231523fn f() {
1524 var a : A;
1524 var a : A = undefined;
15251525 a.foo = 1;
15261526 const y = a.bar;
15271527}
......@@ -1652,7 +1652,7 @@ struct Foo {}
16521652struct Bar {}
16531653
16541654fn f(Foo: i32) {
1655 var Bar : i32;
1655 var Bar : i32 = undefined;
16561656}
16571657 )SOURCE", 2, ".tmp_source.zig:5:6: error: variable shadows type 'Foo'",
16581658 ".tmp_source.zig:6:5: error: variable shadows type 'Bar'");