# HG changeset patch # User vromero # Date 1387204332 0 # Node ID dd5777a77f9162415993264bd7e84e5c001fa106 # Parent c75c0b9b574334fb2276bfacbbe163d69c7c1829 8020216: javac, compile time error isn't shown when final static field is not assigned Reviewed-by: jjg diff -r c75c0b9b5743 -r dd5777a77f91 langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java Fri Dec 13 09:36:24 2013 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java Mon Dec 16 14:32:12 2013 +0000 @@ -1461,9 +1461,19 @@ this.names = names; } + 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,16 @@ 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.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 @@ -1733,8 +1751,7 @@ Assert.check(pendingExits.isEmpty()); try { - boolean isInitialConstructor = - TreeInfo.isInitialConstructor(tree); + isInitialConstructor = TreeInfo.isInitialConstructor(tree); if (!isInitialConstructor) { firstadr = nextadr; @@ -1789,6 +1806,7 @@ nextadr = nextadrPrev; firstadr = firstadrPrev; returnadr = returnadrPrev; + isInitialConstructor = false; } } diff -r c75c0b9b5743 -r dd5777a77f91 langtools/test/tools/javac/flow/T8020216/CompileTimeErrorForNonAssignedStaticFieldTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/flow/T8020216/CompileTimeErrorForNonAssignedStaticFieldTest.java Mon Dec 16 14:32:12 2013 +0000 @@ -0,0 +1,29 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8020216 + * @summary javac, compile time error isn't shown when final static field is not assigned + * @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 -r c75c0b9b5743 -r dd5777a77f91 langtools/test/tools/javac/flow/T8020216/CompileTimeErrorForNonAssignedStaticFieldTest.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/flow/T8020216/CompileTimeErrorForNonAssignedStaticFieldTest.out Mon Dec 16 14:32:12 2013 +0000 @@ -0,0 +1,2 @@ +CompileTimeErrorForNonAssignedStaticFieldTest.java:14:5: compiler.err.var.might.not.have.been.initialized: i +1 error