Perform implicit narrowing and widening on field initializer values

MOE_MIGRATED_REVID=138014342
diff --git a/java/com/google/turbine/binder/Binder.java b/java/com/google/turbine/binder/Binder.java
index 670e94e..3e39955 100644
--- a/java/com/google/turbine/binder/Binder.java
+++ b/java/com/google/turbine/binder/Binder.java
@@ -287,9 +287,8 @@
               @Override
               public Const.Value complete(Env<FieldSymbol, Const.Value> env1, FieldSymbol k) {
                 try {
-                  Const constant =
-                      new ConstEvaluator(sym, info, info.scope(), env1, baseEnv).eval(init.get());
-                  return (constant instanceof Const.Value) ? (Const.Value) constant : null;
+                  return new ConstEvaluator(sym, info, info.scope(), env1, baseEnv)
+                      .evalFieldInitializer(init.get(), field.type());
                 } catch (LazyEnv.LazyBindingError e) {
                   // fields initializers are allowed to reference the field being initialized,
                   // but if they do they aren't constants
diff --git a/java/com/google/turbine/binder/ConstEvaluator.java b/java/com/google/turbine/binder/ConstEvaluator.java
index e68e28a..df8ae02 100644
--- a/java/com/google/turbine/binder/ConstEvaluator.java
+++ b/java/com/google/turbine/binder/ConstEvaluator.java
@@ -939,4 +939,12 @@
   private TurbineError error(int position, String message, Object... args) {
     return TurbineError.format(base.source(), position, message, args);
   }
+
+  public Const.Value evalFieldInitializer(Expression expression, Type type) {
+    Const value = eval(expression);
+    if (value == null || value.kind() != Const.Kind.PRIMITIVE) {
+      return null;
+    }
+    return (Const.Value) cast(type, value);
+  }
 }
diff --git a/javatests/com/google/turbine/lower/LowerIntegrationTest.java b/javatests/com/google/turbine/lower/LowerIntegrationTest.java
index d2406d9..996c400 100644
--- a/javatests/com/google/turbine/lower/LowerIntegrationTest.java
+++ b/javatests/com/google/turbine/lower/LowerIntegrationTest.java
@@ -260,6 +260,7 @@
       "type_anno_retention.test",
       "member_import_clash.test",
       "anno_repeated.test",
+      "long_expression.test",
     };
     List<Object[]> tests =
         ImmutableList.copyOf(testCases).stream().map(x -> new Object[] {x}).collect(toList());
diff --git a/javatests/com/google/turbine/lower/testdata/long_expression.test b/javatests/com/google/turbine/lower/testdata/long_expression.test
new file mode 100644
index 0000000..409a5a3
--- /dev/null
+++ b/javatests/com/google/turbine/lower/testdata/long_expression.test
@@ -0,0 +1,11 @@
+=== Test.java ===
+class Test {
+  static final long DAY_IN_MILLISECONDS = 24 * 60 * 60 * 1000;
+  static final long HUNDRED_YEARS_IN_MILLISECONDS =
+    100 * 365 * DAY_IN_MILLISECONDS;
+  static final long A = Long.MAX_VALUE;
+  static final long B = A - HUNDRED_YEARS_IN_MILLISECONDS;
+
+  static final long OVERFLOW = 24 * 60 * 60 * 1000 * 1000 * 1000L;
+  static final long NO_OVERFLOW = 24L * 60 * 60 * 1000 * 1000 * 1000;
+}