8030218: javac, compile time error isn't shown when final static field is not assigned, follow-up

Reviewed-by: jjg, jfranck, sundar
This commit is contained in:
Vicente Romero 2013-12-19 21:58:50 +00:00
parent 3c77de74be
commit a4bac02fa4
3 changed files with 56 additions and 6 deletions

View file

@ -1460,9 +1460,19 @@ public class Flow {
this.names = names; this.names = names;
} }
private boolean isInitialConstructor = false;
@Override @Override
protected void markDead(JCTree tree) { 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); uninits.inclRange(returnadr, nextadr);
} }
@ -1475,8 +1485,17 @@ public class Flow {
return return
sym.pos >= startPos && sym.pos >= startPos &&
((sym.owner.kind == MTH || ((sym.owner.kind == MTH ||
((sym.flags() & (FINAL | HASINIT | PARAMETER)) == FINAL && isFinalUninitializedField(sym)));
classDef.sym.isEnclosedBy((ClassSymbol)sym.owner)))); }
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 /** Initialize new trackable variable by setting its address field
@ -1730,10 +1749,9 @@ public class Flow {
int returnadrPrev = returnadr; int returnadrPrev = returnadr;
Assert.check(pendingExits.isEmpty()); Assert.check(pendingExits.isEmpty());
boolean lastInitialConstructor = isInitialConstructor;
try { try {
boolean isInitialConstructor = isInitialConstructor = TreeInfo.isInitialConstructor(tree);
TreeInfo.isInitialConstructor(tree);
if (!isInitialConstructor) { if (!isInitialConstructor) {
firstadr = nextadr; firstadr = nextadr;
@ -1788,6 +1806,7 @@ public class Flow {
nextadr = nextadrPrev; nextadr = nextadrPrev;
firstadr = firstadrPrev; firstadr = firstadrPrev;
returnadr = returnadrPrev; returnadr = returnadrPrev;
isInitialConstructor = lastInitialConstructor;
} }
} }

View file

@ -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);
}
}
}

View file

@ -0,0 +1,2 @@
CompileTimeErrorForNonAssignedStaticFieldTest.java:14:5: compiler.err.var.might.not.have.been.initialized: i
1 error