From 075b3aba1bdbcb26488529fe35778981d219e5ca Mon Sep 17 00:00:00 2001 From: Zenong Zhang <41390071+SlaterLatiao@users.noreply.github.com> Date: Sun, 24 Jul 2022 15:32:38 -0700 Subject: [PATCH] Implementation of unformed state for global variables. (#1571) - Allocate UninitializedValue on heap when a VariableDeclaration does not have initialization. - Added test cases. --- explorer/interpreter/interpreter.cpp | 3 +++ ...arbon => fail_global_uninitialized.carbon} | 5 ++-- ...=> fail_local_uninitialized_assign.carbon} | 2 +- ...n => fail_local_uninitialized_init.carbon} | 2 +- ... => fail_local_uninitialized_param.carbon} | 2 +- ...> fail_local_uninitialized_pattern.carbon} | 2 +- .../fail_local_uninitialized_return.carbon | 17 +++++++++++++ .../uninitialized/global_declare.carbon | 19 ++++++++++++++ .../global_uninit_without_use.carbon | 18 +++++++++++++ .../global_uninitialized_escape.carbon | 25 +++++++++++++++++++ ...rbon => local_uninitialized_escape.carbon} | 0 11 files changed, 89 insertions(+), 6 deletions(-) rename explorer/testdata/uninitialized/{fail_uninitialized_return.carbon => fail_global_uninitialized.carbon} (89%) rename explorer/testdata/uninitialized/{fail_uninitialized_assign.carbon => fail_local_uninitialized_assign.carbon} (83%) rename explorer/testdata/uninitialized/{fail_uninitialized_init.carbon => fail_local_uninitialized_init.carbon} (83%) rename explorer/testdata/uninitialized/{fail_uninitialized_param.carbon => fail_local_uninitialized_param.carbon} (84%) rename explorer/testdata/uninitialized/{fail_uninitialized_pattern.carbon => fail_local_uninitialized_pattern.carbon} (83%) create mode 100644 explorer/testdata/uninitialized/fail_local_uninitialized_return.carbon create mode 100644 explorer/testdata/uninitialized/global_declare.carbon create mode 100644 explorer/testdata/uninitialized/global_uninit_without_use.carbon create mode 100644 explorer/testdata/uninitialized/global_uninitialized_escape.carbon rename explorer/testdata/uninitialized/{uninitialized_escape.carbon => local_uninitialized_escape.carbon} (100%) 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