Commit 4e43973413

Andrew Kelley <superjoe30@gmail.com>
2016-01-26 07:56:46
variable initializations are now mandatory
use `undefined` if you want uninitialized memory
1 parent b215a3e
Changed files (8)
doc/langref.md
@@ -9,7 +9,7 @@ TopLevelDecl : FnDef | ExternBlock | RootExportDecl | Import | ContainerDecl | V
 
 ErrorValueDecl : option(FnVisibleMod) "error" "Symbol"
 
-VariableDeclaration : option(FnVisibleMod) ("var" | "const") "Symbol" ("=" Expression | ":" PrefixOpExpression option("=" Expression))
+VariableDeclaration : option(FnVisibleMod) ("var" | "const") "Symbol" option(":" PrefixOpExpression) "=" Expression
 
 ContainerDecl : many(Directive) option(FnVisibleMod) ("struct" | "enum") "Symbol" "{" many(StructMember) "}"
 
example/cat/main.zig
@@ -18,11 +18,10 @@ pub fn main(args: [][]u8) -> %void {
         } else if (arg[0] == '-') {
             return usage(exe);
         } else {
-            var is: InputStream;
-            is.open(arg, OpenReadOnly) %% |err| {
+            var is = input_stream_open(arg, OpenReadOnly) %% |err| {
                 %%stderr.print("Unable to open file: {}", ([]u8)(err));
                 return err;
-            }
+            };
             defer is.close();
 
             catted_anything = true;
@@ -40,7 +39,7 @@ fn usage(exe: []u8) -> %void {
 }
 
 fn cat_stream(is: InputStream) -> %void {
-    var buf: [1024 * 4]u8;
+    var buf: [1024 * 4]u8 = undefined;
 
     while (true) {
         const bytes_read = is.read(buf) %% |err| {
example/guess_number/main.zig
@@ -6,7 +6,7 @@ import "rand.zig";
 pub fn main(args: [][]u8) -> %void {
     %%stderr.print_str("Welcome to the Guess Number Game in Zig.\n");
 
-    var seed : u32;
+    var seed : u32 = undefined;
     const seed_bytes = (&u8)(&seed)[0...4];
     %%os_get_random_bytes(seed_bytes);
 
@@ -16,7 +16,7 @@ pub fn main(args: [][]u8) -> %void {
 
     while (true) {
         %%stderr.print_str("\nGuess a number between 1 and 100: ");
-        var line_buf : [20]u8;
+        var line_buf : [20]u8 = undefined;
 
         const line_len = stdin.read(line_buf) %% |err| {
             %%stderr.print_str("Unable to read from stdin.\n");
src/analyze.cpp
@@ -2625,7 +2625,7 @@ static VariableTableEntry *analyze_variable_declaration_raw(CodeGen *g, ImportTa
     }
 
     TypeTableEntry *implicit_type = nullptr;
-    if (variable_declaration->expr != nullptr) {
+    if (variable_declaration->expr) {
         implicit_type = analyze_expression(g, import, context, explicit_type, variable_declaration->expr);
         if (implicit_type->id == TypeTableEntryIdInvalid) {
             // ignore the poison value
@@ -2657,10 +2657,8 @@ static VariableTableEntry *analyze_variable_declaration_raw(CodeGen *g, ImportTa
                         buf_sprintf("global variable initializer requires constant expression"));
             }
         }
-    }
-
-    if (implicit_type == nullptr && is_const) {
-        add_node_error(g, source_node, buf_sprintf("const variable missing initialization"));
+    } else {
+        add_node_error(g, source_node, buf_sprintf("variables must be initialized"));
         implicit_type = g->builtin_types.entry_invalid;
     }
 
std/bootstrap.zig
@@ -24,7 +24,7 @@ fn strlen(ptr: &const u8) -> isize {
 }
 
 fn call_main() -> unreachable {
-    var args: [argc][]u8;
+    var args: [argc][]u8 = undefined;
     for (arg, args, i) {
         const ptr = argv[i];
         args[i] = ptr[0...strlen(ptr)];
std/rand.zig
@@ -27,7 +27,7 @@ pub struct Rand {
     pub fn get_bytes(r: &Rand, buf: []u8) {
         var bytes_left = r.get_bytes_aligned(buf);
         if (bytes_left > 0) {
-            var rand_val_array : [@sizeof(u32)]u8;
+            var rand_val_array : [@sizeof(u32)]u8 = undefined;
             *((&u32)(rand_val_array.ptr)) = r.get_u32();
             while (bytes_left > 0) {
                 buf[buf.len - bytes_left] = rand_val_array[@sizeof(u32) - bytes_left];
@@ -42,7 +42,7 @@ pub struct Rand {
         const range = end - start;
         const leftover = @max_value(u64) % range;
         const upper_bound = @max_value(u64) - leftover;
-        var rand_val_array : [@sizeof(u64)]u8;
+        var rand_val_array : [@sizeof(u64)]u8 = undefined;
 
         while (true) {
             r.get_bytes_aligned(rand_val_array);
@@ -79,7 +79,7 @@ pub struct Rand {
 
 /// Initialize random state with the given seed.
 pub fn rand_new(seed: u32) -> Rand {
-    var r: Rand;
+    var r: Rand = undefined;
     r.index = 0;
     r.array[0] = seed;
     var i : isize = 1;
std/std.zig
@@ -209,7 +209,7 @@ fn buf_print_i64(out_buf: []u8, x: i64) -> isize {
 }
 
 fn buf_print_u64(out_buf: []u8, x: u64) -> isize {
-    var buf: [max_u64_base10_digits]u8;
+    var buf: [max_u64_base10_digits]u8 = undefined;
     var a = x;
     var index = buf.len;
 
test/run_tests.cpp
@@ -344,7 +344,7 @@ pub fn main(args: [][]u8) -> %void {
 import "std.zig";
 
 pub fn main(args: [][]u8) -> %void {
-    var array: [4]void;
+    var array: [4]void = undefined;
     array[0] = void{};
     array[1] = array[2];
     if (@sizeof(@typeof(array)) != 0) {
@@ -377,7 +377,7 @@ pub fn main(args: [][]u8) -> %void {
 import "std.zig";
 
 pub fn main(args: [][]u8) -> %void {
-    var array : [5]i32;
+    var array : [5]i32 = undefined;
 
     var i : i32 = 0;
     while (i < 5) {
@@ -613,7 +613,7 @@ export fn main(argc: c_int, argv: &&u8) -> c_int {
 import "std.zig";
 
 pub fn main(args: [][]u8) -> %void {
-    var foo : Foo;
+    var foo : Foo = undefined;
     @memset(&foo, 0, @sizeof(Foo));
     foo.a += 1;
     foo.b = foo.a == 1;
@@ -649,10 +649,10 @@ struct Val {
     x: i32,
 }
 fn test_point_to_self() {
-    var root : Node;
+    var root : Node = undefined;
     root.val.x = 1;
 
-    var node : Node;
+    var node : Node = undefined;
     node.next = &root;
     node.val.x = 2;
 
@@ -663,8 +663,8 @@ fn test_point_to_self() {
     }
 }
 fn test_byval_assign() {
-    var foo1 : Foo;
-    var foo2 : Foo;
+    var foo1 : Foo = undefined;
+    var foo2 : Foo = undefined;
 
     foo1.a = 1234;
 
@@ -829,7 +829,7 @@ import "std.zig";
 const ARRAY_SIZE : i8 = 20;
 
 pub fn main(args: [][]u8) -> %void {
-    var array : [ARRAY_SIZE]u8;
+    var array : [ARRAY_SIZE]u8 = undefined;
     %%stdout.print_u64(@sizeof(@typeof(array)));
     %%stdout.printf("\n");
 }
@@ -924,7 +924,7 @@ pub fn main(args: [][]u8) -> %void {
     add_simple_case("slicing", R"SOURCE(
 import "std.zig";
 pub fn main(args: [][]u8) -> %void {
-    var array : [20]i32;
+    var array : [20]i32 = undefined;
 
     array[5] = 1234;
 
@@ -969,7 +969,7 @@ fn f(c: u8) -> u8 {
     add_simple_case("overflow intrinsics", R"SOURCE(
 import "std.zig";
 pub fn main(args: [][]u8) -> %void {
-    var result: u8;
+    var result: u8 = undefined;
     if (!@add_with_overflow(u8, 250, 100, &result)) {
         %%stdout.printf("BAD\n");
     }
@@ -986,8 +986,8 @@ pub fn main(args: [][]u8) -> %void {
     add_simple_case("memcpy and memset intrinsics", R"SOURCE(
 import "std.zig";
 pub fn main(args: [][]u8) -> %void {
-    var foo : [20]u8;
-    var bar : [20]u8;
+    var foo : [20]u8 = undefined;
+    var bar : [20]u8 = undefined;
 
     @memset(foo.ptr, 'A', foo.len);
     @memcpy(bar.ptr, foo.ptr, bar.len);
@@ -1475,7 +1475,7 @@ fn f() {
 
     add_compile_fail_case("array access errors", R"SOURCE(
 fn f() {
-    var bad : bool;
+    var bad : bool = undefined;
     i[i] = i[i];
     bad[bad] = bad[bad];
 }
@@ -1521,7 +1521,7 @@ struct C { a : A, }
     add_compile_fail_case("invalid struct field", R"SOURCE(
 struct A { x : i32, }
 fn f() {
-    var a : A;
+    var a : A = undefined;
     a.foo = 1;
     const y = a.bar;
 }
@@ -1652,7 +1652,7 @@ struct Foo {}
 struct Bar {}
 
 fn f(Foo: i32) {
-    var Bar : i32;
+    var Bar : i32 = undefined;
 }
     )SOURCE", 2, ".tmp_source.zig:5:6: error: variable shadows type 'Foo'",
                  ".tmp_source.zig:6:5: error: variable shadows type 'Bar'");