diff --git a/explorer/interpreter/interpreter.cpp b/explorer/interpreter/interpreter.cpp index 5fcfc6bb4524..a8c362887be0 100644 --- a/explorer/interpreter/interpreter.cpp +++ b/explorer/interpreter/interpreter.cpp @@ -1627,6 +1627,9 @@ auto Interpreter::StepDeclaration() -> ErrorOr { return todo_.FinishAction(); } } else { + Nonnull v = + arena_->New(&var_decl.binding().value()); + todo_.Initialize(&var_decl.binding(), v); return todo_.FinishAction(); } } diff --git a/explorer/testdata/uninitialized/fail_uninitialized_return.carbon b/explorer/testdata/uninitialized/fail_global_uninitialized.carbon similarity index 89% rename from explorer/testdata/uninitialized/fail_uninitialized_return.carbon rename to explorer/testdata/uninitialized/fail_global_uninitialized.carbon index cf7ba710aa46..3d2eda222809 100644 --- a/explorer/testdata/uninitialized/fail_uninitialized_return.carbon +++ b/explorer/testdata/uninitialized/fail_global_uninitialized.carbon @@ -10,8 +10,9 @@ package ExplorerTest api; +var x: i32; + fn Main() -> i32 { - var x: i32; - // CHECK: RUNTIME ERROR: {{.*}}/explorer/testdata/uninitialized/fail_uninitialized_return.carbon:[[@LINE+1]]: undefined behavior: access to uninitialized value Uninit> + // CHECK: RUNTIME ERROR: {{.*}}/explorer/testdata/uninitialized/fail_global_uninitialized.carbon:[[@LINE+1]]: undefined behavior: access to uninitialized value Uninit> return x; } diff --git a/explorer/testdata/uninitialized/fail_uninitialized_assign.carbon b/explorer/testdata/uninitialized/fail_local_uninitialized_assign.carbon similarity index 83% rename from explorer/testdata/uninitialized/fail_uninitialized_assign.carbon rename to explorer/testdata/uninitialized/fail_local_uninitialized_assign.carbon index 099c4c319093..732c5764ad8e 100644 --- a/explorer/testdata/uninitialized/fail_uninitialized_assign.carbon +++ b/explorer/testdata/uninitialized/fail_local_uninitialized_assign.carbon @@ -13,7 +13,7 @@ package ExplorerTest api; fn Main() -> i32 { var x: i32; var y: i32; - // CHECK: RUNTIME ERROR: {{.*}}/explorer/testdata/uninitialized/fail_uninitialized_assign.carbon:[[@LINE+1]]: undefined behavior: access to uninitialized value Uninit> + // CHECK: RUNTIME ERROR: {{.*}}/explorer/testdata/uninitialized/fail_local_uninitialized_assign.carbon:[[@LINE+1]]: undefined behavior: access to uninitialized value Uninit> y = x; return y; } diff --git a/explorer/testdata/uninitialized/fail_uninitialized_init.carbon b/explorer/testdata/uninitialized/fail_local_uninitialized_init.carbon similarity index 83% rename from explorer/testdata/uninitialized/fail_uninitialized_init.carbon rename to explorer/testdata/uninitialized/fail_local_uninitialized_init.carbon index c50f2c9cc394..f34756b34bcb 100644 --- a/explorer/testdata/uninitialized/fail_uninitialized_init.carbon +++ b/explorer/testdata/uninitialized/fail_local_uninitialized_init.carbon @@ -12,7 +12,7 @@ package ExplorerTest api; fn Main() -> i32 { var x: i32; - // CHECK: RUNTIME ERROR: {{.*}}/explorer/testdata/uninitialized/fail_uninitialized_init.carbon:[[@LINE+1]]: undefined behavior: access to uninitialized value Uninit> + // CHECK: RUNTIME ERROR: {{.*}}/explorer/testdata/uninitialized/fail_local_uninitialized_init.carbon:[[@LINE+1]]: undefined behavior: access to uninitialized value Uninit> var y: i32 = x; return x; } diff --git a/explorer/testdata/uninitialized/fail_uninitialized_param.carbon b/explorer/testdata/uninitialized/fail_local_uninitialized_param.carbon similarity index 84% rename from explorer/testdata/uninitialized/fail_uninitialized_param.carbon rename to explorer/testdata/uninitialized/fail_local_uninitialized_param.carbon index adfcf8add8ea..612bf341d178 100644 --- a/explorer/testdata/uninitialized/fail_uninitialized_param.carbon +++ b/explorer/testdata/uninitialized/fail_local_uninitialized_param.carbon @@ -16,6 +16,6 @@ fn AddInt(a: i32, b: i32) -> auto { fn Main() -> i32 { var x: i32; - // CHECK: RUNTIME ERROR: {{.*}}/explorer/testdata/uninitialized/fail_uninitialized_param.carbon:[[@LINE+1]]: undefined behavior: access to uninitialized value Uninit> + // CHECK: RUNTIME ERROR: {{.*}}/explorer/testdata/uninitialized/fail_local_uninitialized_param.carbon:[[@LINE+1]]: undefined behavior: access to uninitialized value Uninit> return AddInt(x, 2); } diff --git a/explorer/testdata/uninitialized/fail_uninitialized_pattern.carbon b/explorer/testdata/uninitialized/fail_local_uninitialized_pattern.carbon similarity index 83% rename from explorer/testdata/uninitialized/fail_uninitialized_pattern.carbon rename to explorer/testdata/uninitialized/fail_local_uninitialized_pattern.carbon index 07d733fb8b21..eaeb22bc60c8 100644 --- a/explorer/testdata/uninitialized/fail_uninitialized_pattern.carbon +++ b/explorer/testdata/uninitialized/fail_local_uninitialized_pattern.carbon @@ -13,6 +13,6 @@ package ExplorerTest api; fn Main() -> i32 { var (x: i32, y: i32); x = 1; - // CHECK: RUNTIME ERROR: {{.*}}/explorer/testdata/uninitialized/fail_uninitialized_pattern.carbon:[[@LINE+1]]: undefined behavior: access to uninitialized value Uninit> + // CHECK: RUNTIME ERROR: {{.*}}/explorer/testdata/uninitialized/fail_local_uninitialized_pattern.carbon:[[@LINE+1]]: undefined behavior: access to uninitialized value Uninit> return y; } diff --git a/explorer/testdata/uninitialized/fail_local_uninitialized_return.carbon b/explorer/testdata/uninitialized/fail_local_uninitialized_return.carbon new file mode 100644 index 000000000000..dd3e6bea0ca9 --- /dev/null +++ b/explorer/testdata/uninitialized/fail_local_uninitialized_return.carbon @@ -0,0 +1,17 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// RUN: %{not} %{explorer} %s 2>&1 | \ +// RUN: %{FileCheck} --match-full-lines --allow-unused-prefixes=false %s +// RUN: %{not} %{explorer} --parser_debug --trace_file=- %s 2>&1 | \ +// RUN: %{FileCheck} --match-full-lines --allow-unused-prefixes %s +// AUTOUPDATE: %{explorer} %s + +package ExplorerTest api; + +fn Main() -> i32 { + var x: i32; + // CHECK: RUNTIME ERROR: {{.*}}/explorer/testdata/uninitialized/fail_local_uninitialized_return.carbon:[[@LINE+1]]: undefined behavior: access to uninitialized value Uninit> + return x; +} diff --git a/explorer/testdata/uninitialized/global_declare.carbon b/explorer/testdata/uninitialized/global_declare.carbon new file mode 100644 index 000000000000..561e842ba908 --- /dev/null +++ b/explorer/testdata/uninitialized/global_declare.carbon @@ -0,0 +1,19 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// RUN: %{explorer} %s 2>&1 | \ +// RUN: %{FileCheck} --match-full-lines --allow-unused-prefixes=false %s +// RUN: %{explorer} --parser_debug --trace_file=- %s 2>&1 | \ +// RUN: %{FileCheck} --match-full-lines --allow-unused-prefixes %s +// AUTOUPDATE: %{explorer} %s +// CHECK: result: 1 + +package ExplorerTest api; + +var x: i32; + +fn Main() -> i32 { + x = 1; + return x; +} diff --git a/explorer/testdata/uninitialized/global_uninit_without_use.carbon b/explorer/testdata/uninitialized/global_uninit_without_use.carbon new file mode 100644 index 000000000000..8d334acdfea5 --- /dev/null +++ b/explorer/testdata/uninitialized/global_uninit_without_use.carbon @@ -0,0 +1,18 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// RUN: %{explorer} %s 2>&1 | \ +// RUN: %{FileCheck} --match-full-lines --allow-unused-prefixes=false %s +// RUN: %{explorer} --parser_debug --trace_file=- %s 2>&1 | \ +// RUN: %{FileCheck} --match-full-lines --allow-unused-prefixes %s +// AUTOUPDATE: %{explorer} %s +// CHECK: result: 1 + +package ExplorerTest api; + +var x: i32; + +fn Main() -> i32 { + return 1; +} diff --git a/explorer/testdata/uninitialized/global_uninitialized_escape.carbon b/explorer/testdata/uninitialized/global_uninitialized_escape.carbon new file mode 100644 index 000000000000..8acbb6ed9e27 --- /dev/null +++ b/explorer/testdata/uninitialized/global_uninitialized_escape.carbon @@ -0,0 +1,25 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// RUN: %{explorer} %s 2>&1 | \ +// RUN: %{FileCheck} --match-full-lines --allow-unused-prefixes=false %s +// RUN: %{explorer} --parser_debug --trace_file=- %s 2>&1 | \ +// RUN: %{FileCheck} --match-full-lines --allow-unused-prefixes %s +// AUTOUPDATE: %{explorer} %s +// CHECK: result: 42 + +package ExplorerTest api; + +// `y` is unformed here. +var y: i32; + +fn AssignIntTo(x: i32, destination: i32*) { + *destination = x; +} + +fn Main() -> i32 { + AssignIntTo(42, &y); + // `y` is fully formed and usable. + return y; +} diff --git a/explorer/testdata/uninitialized/uninitialized_escape.carbon b/explorer/testdata/uninitialized/local_uninitialized_escape.carbon similarity index 100% rename from explorer/testdata/uninitialized/uninitialized_escape.carbon rename to explorer/testdata/uninitialized/local_uninitialized_escape.carbon