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...@@ -9,7 +9,7 @@ TopLevelDecl : FnDef | ExternBlock | RootExportDecl | Import | ContainerDecl | V
99
10ErrorValueDecl : option(FnVisibleMod) "error" "Symbol"10ErrorValueDecl : 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
14ContainerDecl : many(Directive) option(FnVisibleMod) ("struct" | "enum") "Symbol" "{" many(StructMember) "}"14ContainerDecl : 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 {...@@ -18,11 +18,10 @@ pub fn main(args: [][]u8) -> %void {
18 } else if (arg[0] == '-') {18 } else if (arg[0] == '-') {
19 return usage(exe);19 return usage(exe);
20 } else {20 } else {
21 var is: InputStream;21 var is = input_stream_open(arg, OpenReadOnly) %% |err| {
22 is.open(arg, OpenReadOnly) %% |err| {
23 %%stderr.print("Unable to open file: {}", ([]u8)(err));22 %%stderr.print("Unable to open file: {}", ([]u8)(err));
24 return err;23 return err;
25 }24 };
26 defer is.close();25 defer is.close();
2726
28 catted_anything = true;27 catted_anything = true;
...@@ -40,7 +39,7 @@ fn usage(exe: []u8) -> %void {...@@ -40,7 +39,7 @@ fn usage(exe: []u8) -> %void {
40}39}
4140
42fn cat_stream(is: InputStream) -> %void {41fn cat_stream(is: InputStream) -> %void {
43 var buf: [1024 * 4]u8;42 var buf: [1024 * 4]u8 = undefined;
4443
45 while (true) {44 while (true) {
46 const bytes_read = is.read(buf) %% |err| {45 const bytes_read = is.read(buf) %% |err| {
example/guess_number/main.zig+2-2
...@@ -6,7 +6,7 @@ import "rand.zig";...@@ -6,7 +6,7 @@ import "rand.zig";
6pub fn main(args: [][]u8) -> %void {6pub fn main(args: [][]u8) -> %void {
7 %%stderr.print_str("Welcome to the Guess Number Game in Zig.\n");7 %%stderr.print_str("Welcome to the Guess Number Game in Zig.\n");
88
9 var seed : u32;9 var seed : u32 = undefined;
10 const seed_bytes = (&u8)(&seed)[0...4];10 const seed_bytes = (&u8)(&seed)[0...4];
11 %%os_get_random_bytes(seed_bytes);11 %%os_get_random_bytes(seed_bytes);
1212
...@@ -16,7 +16,7 @@ pub fn main(args: [][]u8) -> %void {...@@ -16,7 +16,7 @@ pub fn main(args: [][]u8) -> %void {
1616
17 while (true) {17 while (true) {
18 %%stderr.print_str("\nGuess a number between 1 and 100: ");18 %%stderr.print_str("\nGuess a number between 1 and 100: ");
19 var line_buf : [20]u8;19 var line_buf : [20]u8 = undefined;
2020
21 const line_len = stdin.read(line_buf) %% |err| {21 const line_len = stdin.read(line_buf) %% |err| {
22 %%stderr.print_str("Unable to read from stdin.\n");22 %%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...@@ -2625,7 +2625,7 @@ static VariableTableEntry *analyze_variable_declaration_raw(CodeGen *g, ImportTa
2625 }2625 }
26262626
2627 TypeTableEntry *implicit_type = nullptr;2627 TypeTableEntry *implicit_type = nullptr;
2628 if (variable_declaration->expr != nullptr) {2628 if (variable_declaration->expr) {
2629 implicit_type = analyze_expression(g, import, context, explicit_type, variable_declaration->expr);2629 implicit_type = analyze_expression(g, import, context, explicit_type, variable_declaration->expr);
2630 if (implicit_type->id == TypeTableEntryIdInvalid) {2630 if (implicit_type->id == TypeTableEntryIdInvalid) {
2631 // ignore the poison value2631 // ignore the poison value
...@@ -2657,10 +2657,8 @@ static VariableTableEntry *analyze_variable_declaration_raw(CodeGen *g, ImportTa...@@ -2657,10 +2657,8 @@ static VariableTableEntry *analyze_variable_declaration_raw(CodeGen *g, ImportTa
2657 buf_sprintf("global variable initializer requires constant expression"));2657 buf_sprintf("global variable initializer requires constant expression"));
2658 }2658 }
2659 }2659 }
2660 }2660 } else {
26612661 add_node_error(g, source_node, buf_sprintf("variables must be initialized"));
2662 if (implicit_type == nullptr && is_const) {
2663 add_node_error(g, source_node, buf_sprintf("const variable missing initialization"));
2664 implicit_type = g->builtin_types.entry_invalid;2662 implicit_type = g->builtin_types.entry_invalid;
2665 }2663 }
26662664
std/bootstrap.zig+1-1
...@@ -24,7 +24,7 @@ fn strlen(ptr: &const u8) -> isize {...@@ -24,7 +24,7 @@ fn strlen(ptr: &const u8) -> isize {
24}24}
2525
26fn call_main() -> unreachable {26fn call_main() -> unreachable {
27 var args: [argc][]u8;27 var args: [argc][]u8 = undefined;
28 for (arg, args, i) {28 for (arg, args, i) {
29 const ptr = argv[i];29 const ptr = argv[i];
30 args[i] = ptr[0...strlen(ptr)];30 args[i] = ptr[0...strlen(ptr)];
std/rand.zig+3-3
...@@ -27,7 +27,7 @@ pub struct Rand {...@@ -27,7 +27,7 @@ pub struct Rand {
27 pub fn get_bytes(r: &Rand, buf: []u8) {27 pub fn get_bytes(r: &Rand, buf: []u8) {
28 var bytes_left = r.get_bytes_aligned(buf);28 var bytes_left = r.get_bytes_aligned(buf);
29 if (bytes_left > 0) {29 if (bytes_left > 0) {
30 var rand_val_array : [@sizeof(u32)]u8;30 var rand_val_array : [@sizeof(u32)]u8 = undefined;
31 *((&u32)(rand_val_array.ptr)) = r.get_u32();31 *((&u32)(rand_val_array.ptr)) = r.get_u32();
32 while (bytes_left > 0) {32 while (bytes_left > 0) {
33 buf[buf.len - bytes_left] = rand_val_array[@sizeof(u32) - bytes_left];33 buf[buf.len - bytes_left] = rand_val_array[@sizeof(u32) - bytes_left];
...@@ -42,7 +42,7 @@ pub struct Rand {...@@ -42,7 +42,7 @@ pub struct Rand {
42 const range = end - start;42 const range = end - start;
43 const leftover = @max_value(u64) % range;43 const leftover = @max_value(u64) % range;
44 const upper_bound = @max_value(u64) - leftover;44 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
47 while (true) {47 while (true) {
48 r.get_bytes_aligned(rand_val_array);48 r.get_bytes_aligned(rand_val_array);
...@@ -79,7 +79,7 @@ pub struct Rand {...@@ -79,7 +79,7 @@ pub struct Rand {
7979
80/// Initialize random state with the given seed.80/// Initialize random state with the given seed.
81pub fn rand_new(seed: u32) -> Rand {81pub fn rand_new(seed: u32) -> Rand {
82 var r: Rand;82 var r: Rand = undefined;
83 r.index = 0;83 r.index = 0;
84 r.array[0] = seed;84 r.array[0] = seed;
85 var i : isize = 1;85 var i : isize = 1;
std/std.zig+1-1
...@@ -209,7 +209,7 @@ fn buf_print_i64(out_buf: []u8, x: i64) -> isize {...@@ -209,7 +209,7 @@ fn buf_print_i64(out_buf: []u8, x: i64) -> isize {
209}209}
210210
211fn buf_print_u64(out_buf: []u8, x: u64) -> isize {211fn 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;
213 var a = x;213 var a = x;
214 var index = buf.len;214 var index = buf.len;
215215
test/run_tests.cpp+15-15
...@@ -344,7 +344,7 @@ pub fn main(args: [][]u8) -> %void {...@@ -344,7 +344,7 @@ pub fn main(args: [][]u8) -> %void {
344import "std.zig";344import "std.zig";
345345
346pub fn main(args: [][]u8) -> %void {346pub fn main(args: [][]u8) -> %void {
347 var array: [4]void;347 var array: [4]void = undefined;
348 array[0] = void{};348 array[0] = void{};
349 array[1] = array[2];349 array[1] = array[2];
350 if (@sizeof(@typeof(array)) != 0) {350 if (@sizeof(@typeof(array)) != 0) {
...@@ -377,7 +377,7 @@ pub fn main(args: [][]u8) -> %void {...@@ -377,7 +377,7 @@ pub fn main(args: [][]u8) -> %void {
377import "std.zig";377import "std.zig";
378378
379pub fn main(args: [][]u8) -> %void {379pub fn main(args: [][]u8) -> %void {
380 var array : [5]i32;380 var array : [5]i32 = undefined;
381381
382 var i : i32 = 0;382 var i : i32 = 0;
383 while (i < 5) {383 while (i < 5) {
...@@ -613,7 +613,7 @@ export fn main(argc: c_int, argv: &&u8) -> c_int {...@@ -613,7 +613,7 @@ export fn main(argc: c_int, argv: &&u8) -> c_int {
613import "std.zig";613import "std.zig";
614614
615pub fn main(args: [][]u8) -> %void {615pub fn main(args: [][]u8) -> %void {
616 var foo : Foo;616 var foo : Foo = undefined;
617 @memset(&foo, 0, @sizeof(Foo));617 @memset(&foo, 0, @sizeof(Foo));
618 foo.a += 1;618 foo.a += 1;
619 foo.b = foo.a == 1;619 foo.b = foo.a == 1;
...@@ -649,10 +649,10 @@ struct Val {...@@ -649,10 +649,10 @@ struct Val {
649 x: i32,649 x: i32,
650}650}
651fn test_point_to_self() {651fn test_point_to_self() {
652 var root : Node;652 var root : Node = undefined;
653 root.val.x = 1;653 root.val.x = 1;
654654
655 var node : Node;655 var node : Node = undefined;
656 node.next = &root;656 node.next = &root;
657 node.val.x = 2;657 node.val.x = 2;
658658
...@@ -663,8 +663,8 @@ fn test_point_to_self() {...@@ -663,8 +663,8 @@ fn test_point_to_self() {
663 }663 }
664}664}
665fn test_byval_assign() {665fn test_byval_assign() {
666 var foo1 : Foo;666 var foo1 : Foo = undefined;
667 var foo2 : Foo;667 var foo2 : Foo = undefined;
668668
669 foo1.a = 1234;669 foo1.a = 1234;
670670
...@@ -829,7 +829,7 @@ import "std.zig";...@@ -829,7 +829,7 @@ import "std.zig";
829const ARRAY_SIZE : i8 = 20;829const ARRAY_SIZE : i8 = 20;
830830
831pub fn main(args: [][]u8) -> %void {831pub fn main(args: [][]u8) -> %void {
832 var array : [ARRAY_SIZE]u8;832 var array : [ARRAY_SIZE]u8 = undefined;
833 %%stdout.print_u64(@sizeof(@typeof(array)));833 %%stdout.print_u64(@sizeof(@typeof(array)));
834 %%stdout.printf("\n");834 %%stdout.printf("\n");
835}835}
...@@ -924,7 +924,7 @@ pub fn main(args: [][]u8) -> %void {...@@ -924,7 +924,7 @@ pub fn main(args: [][]u8) -> %void {
924 add_simple_case("slicing", R"SOURCE(924 add_simple_case("slicing", R"SOURCE(
925import "std.zig";925import "std.zig";
926pub fn main(args: [][]u8) -> %void {926pub fn main(args: [][]u8) -> %void {
927 var array : [20]i32;927 var array : [20]i32 = undefined;
928928
929 array[5] = 1234;929 array[5] = 1234;
930930
...@@ -969,7 +969,7 @@ fn f(c: u8) -> u8 {...@@ -969,7 +969,7 @@ fn f(c: u8) -> u8 {
969 add_simple_case("overflow intrinsics", R"SOURCE(969 add_simple_case("overflow intrinsics", R"SOURCE(
970import "std.zig";970import "std.zig";
971pub fn main(args: [][]u8) -> %void {971pub fn main(args: [][]u8) -> %void {
972 var result: u8;972 var result: u8 = undefined;
973 if (!@add_with_overflow(u8, 250, 100, &result)) {973 if (!@add_with_overflow(u8, 250, 100, &result)) {
974 %%stdout.printf("BAD\n");974 %%stdout.printf("BAD\n");
975 }975 }
...@@ -986,8 +986,8 @@ pub fn main(args: [][]u8) -> %void {...@@ -986,8 +986,8 @@ pub fn main(args: [][]u8) -> %void {
986 add_simple_case("memcpy and memset intrinsics", R"SOURCE(986 add_simple_case("memcpy and memset intrinsics", R"SOURCE(
987import "std.zig";987import "std.zig";
988pub fn main(args: [][]u8) -> %void {988pub fn main(args: [][]u8) -> %void {
989 var foo : [20]u8;989 var foo : [20]u8 = undefined;
990 var bar : [20]u8;990 var bar : [20]u8 = undefined;
991991
992 @memset(foo.ptr, 'A', foo.len);992 @memset(foo.ptr, 'A', foo.len);
993 @memcpy(bar.ptr, foo.ptr, bar.len);993 @memcpy(bar.ptr, foo.ptr, bar.len);
...@@ -1475,7 +1475,7 @@ fn f() {...@@ -1475,7 +1475,7 @@ fn f() {
14751475
1476 add_compile_fail_case("array access errors", R"SOURCE(1476 add_compile_fail_case("array access errors", R"SOURCE(
1477fn f() {1477fn f() {
1478 var bad : bool;1478 var bad : bool = undefined;
1479 i[i] = i[i];1479 i[i] = i[i];
1480 bad[bad] = bad[bad];1480 bad[bad] = bad[bad];
1481}1481}
...@@ -1521,7 +1521,7 @@ struct C { a : A, }...@@ -1521,7 +1521,7 @@ struct C { a : A, }
1521 add_compile_fail_case("invalid struct field", R"SOURCE(1521 add_compile_fail_case("invalid struct field", R"SOURCE(
1522struct A { x : i32, }1522struct A { x : i32, }
1523fn f() {1523fn f() {
1524 var a : A;1524 var a : A = undefined;
1525 a.foo = 1;1525 a.foo = 1;
1526 const y = a.bar;1526 const y = a.bar;
1527}1527}
...@@ -1652,7 +1652,7 @@ struct Foo {}...@@ -1652,7 +1652,7 @@ struct Foo {}
1652struct Bar {}1652struct Bar {}
16531653
1654fn f(Foo: i32) {1654fn f(Foo: i32) {
1655 var Bar : i32;1655 var Bar : i32 = undefined;
1656}1656}
1657 )SOURCE", 2, ".tmp_source.zig:5:6: error: variable shadows type 'Foo'",1657 )SOURCE", 2, ".tmp_source.zig:5:6: error: variable shadows type 'Foo'",
1658 ".tmp_source.zig:6:5: error: variable shadows type 'Bar'");1658 ".tmp_source.zig:6:5: error: variable shadows type 'Bar'");