aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/share/classes/com/sun/tools/javac/comp/Flow.java33
-rw-r--r--test/tools/javac/flow/T8030218/CompileTimeErrorForNonAssignedStaticFieldTest.java29
-rw-r--r--test/tools/javac/flow/T8030218/CompileTimeErrorForNonAssignedStaticFieldTest.out2
3 files changed, 57 insertions, 7 deletions
diff --git a/src/share/classes/com/sun/tools/javac/comp/Flow.java b/src/share/classes/com/sun/tools/javac/comp/Flow.java
index 0c1b2d29..aa528a4f 100644
--- a/src/share/classes/com/sun/tools/javac/comp/Flow.java
+++ b/src/share/classes/com/sun/tools/javac/comp/Flow.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1461,9 +1461,19 @@ public class Flow {
this.names = names;
}
+ private boolean isInitialConstructor = false;
+
@Override
protected void markDead(JCTree tree) {
- inits.inclRange(returnadr, nextadr);
+ if (!isInitialConstructor) {
+ inits.inclRange(returnadr, nextadr);
+ } else {
+ for (int address = returnadr; address < nextadr; address++) {
+ if (!(isFinalUninitializedStaticField(vardecls[address].sym))) {
+ inits.incl(address);
+ }
+ }
+ }
uninits.inclRange(returnadr, nextadr);
}
@@ -1476,8 +1486,17 @@ public class Flow {
return
sym.pos >= startPos &&
((sym.owner.kind == MTH ||
- ((sym.flags() & (FINAL | HASINIT | PARAMETER)) == FINAL &&
- classDef.sym.isEnclosedBy((ClassSymbol)sym.owner))));
+ isFinalUninitializedField(sym)));
+ }
+
+ boolean isFinalUninitializedField(VarSymbol sym) {
+ return sym.owner.kind == TYP &&
+ ((sym.flags() & (FINAL | HASINIT | PARAMETER)) == FINAL &&
+ classDef.sym.isEnclosedBy((ClassSymbol)sym.owner));
+ }
+
+ boolean isFinalUninitializedStaticField(VarSymbol sym) {
+ return isFinalUninitializedField(sym) && sym.isStatic();
}
/** Initialize new trackable variable by setting its address field
@@ -1731,10 +1750,9 @@ public class Flow {
int returnadrPrev = returnadr;
Assert.check(pendingExits.isEmpty());
-
+ boolean lastInitialConstructor = isInitialConstructor;
try {
- boolean isInitialConstructor =
- TreeInfo.isInitialConstructor(tree);
+ isInitialConstructor = TreeInfo.isInitialConstructor(tree);
if (!isInitialConstructor) {
firstadr = nextadr;
@@ -1789,6 +1807,7 @@ public class Flow {
nextadr = nextadrPrev;
firstadr = firstadrPrev;
returnadr = returnadrPrev;
+ isInitialConstructor = lastInitialConstructor;
}
}
diff --git a/test/tools/javac/flow/T8030218/CompileTimeErrorForNonAssignedStaticFieldTest.java b/test/tools/javac/flow/T8030218/CompileTimeErrorForNonAssignedStaticFieldTest.java
new file mode 100644
index 00000000..e139fb7c
--- /dev/null
+++ b/test/tools/javac/flow/T8030218/CompileTimeErrorForNonAssignedStaticFieldTest.java
@@ -0,0 +1,29 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8030218
+ * @summary javac, compile time error isn't shown when final static field is not assigned, follow-up
+ * @compile/fail/ref=CompileTimeErrorForNonAssignedStaticFieldTest.out -XDrawDiagnostics CompileTimeErrorForNonAssignedStaticFieldTest.java
+ */
+
+public class CompileTimeErrorForNonAssignedStaticFieldTest {
+ private final static int i;
+
+ public CompileTimeErrorForNonAssignedStaticFieldTest()
+ throws InstantiationException {
+ throw new InstantiationException("Can't instantiate");
+ }
+
+ static class Inner {
+ private final int j;
+ public Inner(int x)
+ throws InstantiationException {
+ if (x == 0) {
+ throw new InstantiationException("Can't instantiate");
+ } else {
+ j = 1;
+ }
+ System.out.println(j);
+ }
+ }
+
+}
diff --git a/test/tools/javac/flow/T8030218/CompileTimeErrorForNonAssignedStaticFieldTest.out b/test/tools/javac/flow/T8030218/CompileTimeErrorForNonAssignedStaticFieldTest.out
new file mode 100644
index 00000000..78212997
--- /dev/null
+++ b/test/tools/javac/flow/T8030218/CompileTimeErrorForNonAssignedStaticFieldTest.out
@@ -0,0 +1,2 @@
+CompileTimeErrorForNonAssignedStaticFieldTest.java:14:5: compiler.err.var.might.not.have.been.initialized: i
+1 error