Check local constants

Closes #33707

Change-Id: I8046b45aac8eeef60dca405a47a573724af8bfe8
Reviewed-on: https://dart-review.googlesource.com/63280
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 795ed34..40d863f 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -3047,6 +3047,11 @@
     if (node.initializer == null) {
       HInstruction initialValue = graph.addConstantNull(closedWorld);
       localsHandler.updateLocal(local, initialValue);
+    } else if (node.isConst) {
+      ConstantValue constant = _elementMap.getConstantValue(node.initializer);
+      assert(constant != null, failedAt(CURRENT_ELEMENT_SPANNABLE));
+      HInstruction initialValue = graph.addConstant(constant, closedWorld);
+      localsHandler.updateLocal(local, initialValue);
     } else {
       node.initializer.accept(this);
       HInstruction initialValue = pop();
diff --git a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
index d5af387..7d8c5ac 100644
--- a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
+++ b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
@@ -374,6 +374,9 @@
  class Class6 extends Class5 {
     const Class6(a) : super(a - 1);
  }
+ class Class7 {
+    const Class7();
+ }
  ''', const [
     const ConstantData(
         r'"$integer $string $boolean"', 'StringConstant("5 baz false")'),
@@ -522,6 +525,12 @@
     const ConstantData('const Class6(1)', 'NonConstant',
         expectedErrors: MessageKind.INVALID_ASSERT_VALUE_MESSAGE),
     const ConstantData('const Class6(2)', 'ConstructedConstant(Class6())'),
+    const ConstantData('const Class7()', 'ConstructedConstant(Class7())'),
+    const ConstantData('const Class7() == const Class7()', 'NonConstant',
+        expectedErrors: const [
+          MessageKind.INVALID_CONSTANT_BINARY_PRIMITIVE_TYPE,
+          MessageKind.INVALID_CONSTANT_BINARY_PRIMITIVE_TYPE
+        ]),
   ]),
   const TestData('assert', '''
     class A {
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index e0f34b2..8b2f12e 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -312,7 +312,6 @@
 const_switch2_test/01: MissingCompileTimeError
 const_switch_test/02: RuntimeError
 const_switch_test/04: RuntimeError
-constants_test/05: MissingCompileTimeError
 constructor2_test: RuntimeError
 constructor3_test: RuntimeError
 constructor5_test: RuntimeError
@@ -494,12 +493,6 @@
 mixin_supertype_subclass_test/05: CompileTimeError
 mixin_supertype_subclass_test/none: CompileTimeError
 modulo_test: RuntimeError
-multiline_newline_test/04: MissingCompileTimeError
-multiline_newline_test/04r: MissingCompileTimeError
-multiline_newline_test/05: MissingCompileTimeError
-multiline_newline_test/05r: MissingCompileTimeError
-multiline_newline_test/06: MissingCompileTimeError
-multiline_newline_test/06r: MissingCompileTimeError
 named_constructor_test/01: MissingRuntimeError
 named_parameters_default_eq_test/02: MissingCompileTimeError
 nan_identical_test: RuntimeError
@@ -558,7 +551,6 @@
 top_level_getter_no_setter1_test/01: RuntimeError
 top_level_getter_no_setter2_test/01: RuntimeError
 truncdiv_test: RuntimeError
-try_catch_test/01: MissingCompileTimeError
 type_literal_prefix_call_test/00: RuntimeError
 type_variable_conflict2_test/02: MissingCompileTimeError
 
@@ -677,12 +669,6 @@
 multiline_newline_test/02r: CompileTimeError # Issue 23888
 multiline_newline_test/03: CompileTimeError # Issue 23888
 multiline_newline_test/03r: CompileTimeError # Issue 23888
-multiline_newline_test/04: MissingCompileTimeError # Issue 23888
-multiline_newline_test/04r: MissingCompileTimeError # Issue 23888
-multiline_newline_test/05: MissingCompileTimeError # Issue 23888
-multiline_newline_test/05r: MissingCompileTimeError # Issue 23888
-multiline_newline_test/06: MissingCompileTimeError # Issue 23888
-multiline_newline_test/06r: MissingCompileTimeError # Issue 23888
 multiline_newline_test/none: RuntimeError # Issue 23888
 nan_identical_test: Fail # Issue 11551
 not_enough_positional_arguments_test/01: CompileTimeError # Issue 12838
diff --git a/tests/language/language_kernel.status b/tests/language/language_kernel.status
index 0fcf1b1..ca82ca7 100644
--- a/tests/language/language_kernel.status
+++ b/tests/language/language_kernel.status
@@ -24,7 +24,6 @@
 const_map2_test/00: MissingCompileTimeError
 const_map3_test/00: MissingCompileTimeError
 const_switch2_test/01: MissingCompileTimeError
-constants_test/05: MissingCompileTimeError
 constructor_redirect_test/01: MissingCompileTimeError
 deferred_inheritance_constraints_test/extends: MissingCompileTimeError
 deferred_inheritance_constraints_test/implements: MissingCompileTimeError
@@ -102,12 +101,6 @@
 mixin_super_bound2_test/none: CompileTimeError
 mixin_super_constructor_named_test/01: MissingCompileTimeError
 mixin_super_constructor_positionals_test/01: MissingCompileTimeError
-multiline_newline_test/04: MissingCompileTimeError
-multiline_newline_test/04r: MissingCompileTimeError
-multiline_newline_test/05: MissingCompileTimeError
-multiline_newline_test/05r: MissingCompileTimeError
-multiline_newline_test/06: MissingCompileTimeError
-multiline_newline_test/06r: MissingCompileTimeError
 named_parameters_default_eq_test/02: MissingCompileTimeError
 override_field_method1_negative_test: Fail
 override_field_method2_negative_test: Fail
@@ -135,7 +128,6 @@
 switch_case_test/01: MissingCompileTimeError
 switch_case_test/02: MissingCompileTimeError
 syntax_test/none: CompileTimeError
-try_catch_test/01: MissingCompileTimeError
 type_variable_conflict2_test/02: MissingCompileTimeError
 vm/debug_break_enabled_vm_test/01: CompileTimeError
 vm/debug_break_enabled_vm_test/none: CompileTimeError
@@ -154,6 +146,7 @@
 const_syntax_test/05: MissingCompileTimeError
 const_syntax_test/08: MissingCompileTimeError
 const_syntax_test/10: MissingCompileTimeError
+constants_test/05: MissingCompileTimeError
 constructor3_negative_test: Fail
 constructor_call_wrong_argument_count_negative_test: Fail
 deopt_inlined_function_lazy_test: CompileTimeError
@@ -169,6 +162,12 @@
 int2_test: CompileTimeError
 interface_static_non_final_fields_negative_test: Fail
 mint_compares_test: CompileTimeError
+multiline_newline_test/04: MissingCompileTimeError
+multiline_newline_test/04r: MissingCompileTimeError
+multiline_newline_test/05: MissingCompileTimeError
+multiline_newline_test/05r: MissingCompileTimeError
+multiline_newline_test/06: MissingCompileTimeError
+multiline_newline_test/06r: MissingCompileTimeError
 no_such_method_negative_test: Fail
 number_identity_test: CompileTimeError
 prefix10_negative_test: Fail
@@ -184,6 +183,7 @@
 private_member2_negative_test: Fail
 private_member3_negative_test: Fail
 static_call_wrong_argument_count_negative_test: Fail
+try_catch_test/01: MissingCompileTimeError
 type_variable_static_context_negative_test: Fail
 unresolved_in_factory_negative_test: Fail
 unresolved_top_level_method_negative_test: Fail
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 0481a25..ae01ed4c 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -251,7 +251,6 @@
 const_types_test/35: MissingCompileTimeError
 const_types_test/39: MissingCompileTimeError
 const_types_test/40: MissingCompileTimeError
-constants_test/05: MissingCompileTimeError
 constructor_duplicate_final_test/01: MissingCompileTimeError
 constructor_duplicate_final_test/02: MissingCompileTimeError
 constructor_named_arguments_test/01: MissingCompileTimeError
@@ -405,13 +404,9 @@
 mixin_supertype_subclass4_test/05: CompileTimeError
 mixin_supertype_subclass4_test/none: CompileTimeError
 mixin_type_parameters_super_test: RuntimeError
+mock_writable_final_field_test: RuntimeError # Issue 30847
+mock_writable_final_private_field_test: RuntimeError # Issue 17526, 30847
 modulo_test: RuntimeError # non JS number semantics
-multiline_newline_test/04: MissingCompileTimeError
-multiline_newline_test/04r: MissingCompileTimeError
-multiline_newline_test/05: MissingCompileTimeError
-multiline_newline_test/05r: MissingCompileTimeError
-multiline_newline_test/06: MissingCompileTimeError
-multiline_newline_test/06r: MissingCompileTimeError
 named_parameters_default_eq_test/02: MissingCompileTimeError
 nan_identical_test: RuntimeError # Issue 11551
 nested_generic_closure_test: Crash # Unsupported operation: Unsupported type parameter type node F.
@@ -463,7 +458,6 @@
 syntax_test/33: MissingCompileTimeError # Issue 29763
 tearoff_dynamic_test: RuntimeError
 truncdiv_test: RuntimeError # non JS number semantics - Issue 15246
-try_catch_test/01: MissingCompileTimeError
 type_check_const_function_typedef2_test: MissingCompileTimeError
 type_literal_test: RuntimeError
 type_parameter_test/06: Crash # Internal Error: Unexpected type variable in static context.
@@ -524,7 +518,6 @@
 const_switch_test/04: RuntimeError, OK # constant identity based on JS constants
 const_types_test/34: MissingCompileTimeError
 const_types_test/39: MissingCompileTimeError
-constants_test/05: MissingCompileTimeError
 constructor12_test: RuntimeError
 constructor_named_arguments_test/none: RuntimeError
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
@@ -674,13 +667,9 @@
 mixin_supertype_subclass_test/03: CompileTimeError
 mixin_supertype_subclass_test/04: CompileTimeError
 mixin_supertype_subclass_test/none: CompileTimeError
+mock_writable_final_field_test: RuntimeError # Issue 30847
+mock_writable_final_private_field_test: RuntimeError # Issue 17526, 30847
 modulo_test: RuntimeError # non JS number semantics
-multiline_newline_test/04: MissingCompileTimeError
-multiline_newline_test/04r: MissingCompileTimeError
-multiline_newline_test/05: MissingCompileTimeError
-multiline_newline_test/05r: MissingCompileTimeError
-multiline_newline_test/06: MissingCompileTimeError
-multiline_newline_test/06r: MissingCompileTimeError
 named_parameters_default_eq_test/02: MissingCompileTimeError
 named_parameters_default_eq_test/none: RuntimeError
 nan_identical_test: RuntimeError # Issue 11551
@@ -735,7 +724,6 @@
 syntax_test/33: MissingCompileTimeError # Issue 29763
 tearoff_dynamic_test: RuntimeError
 truncdiv_test: RuntimeError # non JS number semantics - Issue 15246
-try_catch_test/01: MissingCompileTimeError
 type_error_test: RuntimeError
 type_literal_test: RuntimeError
 type_promotion_functions_test/02: CompileTimeError
@@ -864,7 +852,6 @@
 const_switch_test/04: RuntimeError, OK # constant identity based on JS constants
 const_types_test/34: MissingCompileTimeError
 const_types_test/39: MissingCompileTimeError
-constants_test/05: MissingCompileTimeError
 constructor12_test: RuntimeError
 constructor_named_arguments_test/none: RuntimeError
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
@@ -1085,13 +1072,9 @@
 mixin_supertype_subclass_test/none: CompileTimeError
 mixin_type_parameters_errors_test/03: MissingCompileTimeError
 mixin_type_parameters_errors_test/04: MissingCompileTimeError
+mock_writable_final_field_test: RuntimeError # Issue 30847
+mock_writable_final_private_field_test: RuntimeError # Issue 17526, 30847
 modulo_test: RuntimeError # non JS number semantics
-multiline_newline_test/04: MissingCompileTimeError
-multiline_newline_test/04r: MissingCompileTimeError
-multiline_newline_test/05: MissingCompileTimeError
-multiline_newline_test/05r: MissingCompileTimeError
-multiline_newline_test/06: MissingCompileTimeError
-multiline_newline_test/06r: MissingCompileTimeError
 named_constructor_test/01: MissingCompileTimeError
 named_parameters_default_eq_test/02: MissingCompileTimeError
 named_parameters_default_eq_test/none: RuntimeError
@@ -1167,7 +1150,6 @@
 syntax_test/33: MissingCompileTimeError # Issue 29763
 tearoff_dynamic_test: RuntimeError
 truncdiv_test: RuntimeError # non JS number semantics - Issue 15246
-try_catch_test/01: MissingCompileTimeError
 type_error_test: RuntimeError
 type_literal_prefix_call_test/00: MissingCompileTimeError
 type_literal_test: RuntimeError
@@ -1320,7 +1302,6 @@
 const_switch_test/04: RuntimeError, OK # constant identity based on JS constants
 const_types_test/34: MissingCompileTimeError
 const_types_test/39: MissingCompileTimeError
-constants_test/05: MissingCompileTimeError
 constructor12_test: RuntimeError
 constructor_named_arguments_test/none: RuntimeError
 constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
@@ -1544,12 +1525,6 @@
 mock_writable_final_field_test: RuntimeError # Issue 30847
 mock_writable_final_private_field_test: RuntimeError # Issue 17526, 30847
 modulo_test: RuntimeError # non JS number semantics
-multiline_newline_test/04: MissingCompileTimeError
-multiline_newline_test/04r: MissingCompileTimeError
-multiline_newline_test/05: MissingCompileTimeError
-multiline_newline_test/05r: MissingCompileTimeError
-multiline_newline_test/06: MissingCompileTimeError
-multiline_newline_test/06r: MissingCompileTimeError
 named_constructor_test/01: MissingCompileTimeError
 named_parameters_default_eq_test/02: MissingCompileTimeError
 named_parameters_default_eq_test/none: RuntimeError
@@ -1624,7 +1599,6 @@
 syntax_test/33: MissingCompileTimeError # Issue 29763
 tearoff_dynamic_test: RuntimeError
 truncdiv_test: RuntimeError # non JS number semantics - Issue 15246
-try_catch_test/01: MissingCompileTimeError
 type_error_test: RuntimeError
 type_literal_prefix_call_test/00: MissingCompileTimeError
 type_literal_test: RuntimeError