# HG changeset patch # User mcimadamore # Date 1417175156 0 # Node ID d4711a6931e2ffbdeb5a457d9e78d0f3955e0c24 # Parent 7afea3897f9bc8c500fb7aeaffd30cbd95f1d4cc 8065986: Compiler fails to NullPointerException when calling super with Object<>() Summary: Missing POLY kind selector on recursive constructor calls with poly arguments Reviewed-by: vromero diff -r 7afea3897f9b -r d4711a6931e2 langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Mon Nov 24 14:52:46 2014 -0800 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Fri Nov 28 11:45:56 2014 +0000 @@ -629,19 +629,19 @@ /** Attribute the arguments in a method call, returning the method kind. */ - KindSelector attribArgs(List trees, Env env, ListBuffer argtypes) { - boolean polykind = false; + KindSelector attribArgs(KindSelector initialKind, List trees, Env env, ListBuffer argtypes) { + KindSelector kind = initialKind; for (JCExpression arg : trees) { Type argtype; if (allowPoly && deferredAttr.isDeferred(env, arg)) { argtype = deferredAttr.new DeferredType(arg, env); - polykind = true; + kind = KindSelector.of(KindSelector.POLY, kind); } else { argtype = chk.checkNonVoid(arg, attribTree(arg, env, unknownAnyPolyInfo)); } argtypes.append(argtype); } - return polykind ? KindSelector.VAL_POLY : KindSelector.VAL; + return kind; } /** Attribute a type argument list, returning a list of types. @@ -1704,7 +1704,7 @@ localEnv.info.isSelfCall = true; // Attribute arguments, yielding list of argument types. - attribArgs(tree.args, localEnv, argtypesBuf); + KindSelector kind = attribArgs(KindSelector.MTH, tree.args, localEnv, argtypesBuf); argtypes = argtypesBuf.toList(); typeargtypes = attribTypes(tree.typeargs, localEnv); @@ -1770,7 +1770,7 @@ // (this will also set the tree's type) Type mpt = newMethodTemplate(resultInfo.pt, argtypes, typeargtypes); checkId(tree.meth, site, sym, localEnv, - new ResultInfo(KindSelector.MTH, mpt)); + new ResultInfo(kind, mpt)); } // Otherwise, `site' is an error type and we do nothing } @@ -1778,7 +1778,7 @@ } else { // Otherwise, we are seeing a regular method call. // Attribute the arguments, yielding list of argument types, ... - KindSelector kind = attribArgs(tree.args, localEnv, argtypesBuf); + KindSelector kind = attribArgs(KindSelector.VAL, tree.args, localEnv, argtypesBuf); argtypes = argtypesBuf.toList(); typeargtypes = attribAnyTypes(tree.typeargs, localEnv); @@ -1958,7 +1958,7 @@ // Attribute constructor arguments. ListBuffer argtypesBuf = new ListBuffer<>(); final KindSelector pkind = - attribArgs(tree.args, localEnv, argtypesBuf); + attribArgs(KindSelector.VAL, tree.args, localEnv, argtypesBuf); List argtypes = argtypesBuf.toList(); List typeargtypes = attribTypes(tree.typeargs, localEnv); diff -r 7afea3897f9b -r d4711a6931e2 langtools/test/tools/javac/generics/diamond/8065986/T8065986a.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/diamond/8065986/T8065986a.java Fri Nov 28 11:45:56 2014 +0000 @@ -0,0 +1,33 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8065986 + * + * @summary Compiler fails to NullPointerException when calling super with Object<>() + * @compile/fail/ref=T8065986a.out T8065986a.java -XDrawDiagnostics + * + */ +import java.util.ArrayList; + +class T8065986a { + T8065986a() { + super(new Object<>()); + } + + T8065986a(boolean b) { + super(new ArrayList<>()); + } + + T8065986a(boolean b1, boolean b2) { + super(()->{}); + } + + T8065986a(boolean b1, boolean b2, boolean b3) { + super(T8065986a::m); + } + + T8065986a(boolean cond, Object o1, Object o2) { + super(cond ? o1 : o2); + } + + static void m() { } +} diff -r 7afea3897f9b -r d4711a6931e2 langtools/test/tools/javac/generics/diamond/8065986/T8065986a.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/diamond/8065986/T8065986a.out Fri Nov 28 11:45:56 2014 +0000 @@ -0,0 +1,6 @@ +T8065986a.java:13:25: compiler.err.cant.apply.diamond.1: java.lang.Object, (compiler.misc.diamond.non.generic: java.lang.Object) +T8065986a.java:17:9: compiler.err.cant.apply.symbol: kindname.constructor, Object, compiler.misc.no.args, java.util.ArrayList, kindname.class, java.lang.Object, (compiler.misc.arg.length.mismatch) +T8065986a.java:21:9: compiler.err.cant.apply.symbol: kindname.constructor, Object, compiler.misc.no.args, @438, kindname.class, java.lang.Object, (compiler.misc.arg.length.mismatch) +T8065986a.java:25:9: compiler.err.cant.apply.symbol: kindname.constructor, Object, compiler.misc.no.args, @520, kindname.class, java.lang.Object, (compiler.misc.arg.length.mismatch) +T8065986a.java:29:9: compiler.err.cant.apply.symbol: kindname.constructor, Object, compiler.misc.no.args, @608, kindname.class, java.lang.Object, (compiler.misc.arg.length.mismatch) +5 errors diff -r 7afea3897f9b -r d4711a6931e2 langtools/test/tools/javac/generics/diamond/8065986/T8065986b.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/diamond/8065986/T8065986b.java Fri Nov 28 11:45:56 2014 +0000 @@ -0,0 +1,33 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8065986 + * + * @summary Compiler fails to NullPointerException when calling super with Object<>() + * @compile/fail/ref=T8065986b.out T8065986b.java -XDrawDiagnostics + * + */ +import java.util.ArrayList; + +class T8065986b { + T8065986b() { + this(new Object<>()); + } + + T8065986b(boolean b) { + this(new ArrayList<>()); + } + + T8065986b(boolean b1, boolean b2) { + this(()->{}); + } + + T8065986b(boolean b1, boolean b2, boolean b3) { + this(T8065986b::m); + } + + T8065986b(boolean cond, Object o1, Object o2) { + this(cond ? o1 : o2); + } + + static void m() { } +} diff -r 7afea3897f9b -r d4711a6931e2 langtools/test/tools/javac/generics/diamond/8065986/T8065986b.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/generics/diamond/8065986/T8065986b.out Fri Nov 28 11:45:56 2014 +0000 @@ -0,0 +1,6 @@ +T8065986b.java:13:24: compiler.err.cant.apply.diamond.1: java.lang.Object, (compiler.misc.diamond.non.generic: java.lang.Object) +T8065986b.java:17:9: compiler.err.cant.apply.symbols: kindname.constructor, T8065986b, java.util.ArrayList,{(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(), (compiler.misc.arg.length.mismatch)),(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(boolean), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.cant.apply.diamond.1: (compiler.misc.diamond: java.util.ArrayList), (compiler.misc.infer.no.conforming.instance.exists: E, java.util.ArrayList, boolean)))),(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(boolean,boolean), (compiler.misc.arg.length.mismatch)),(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(boolean,boolean,boolean), (compiler.misc.arg.length.mismatch)),(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(boolean,java.lang.Object,java.lang.Object), (compiler.misc.arg.length.mismatch))} +T8065986b.java:21:9: compiler.err.cant.apply.symbols: kindname.constructor, T8065986b, @435,{(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(), (compiler.misc.arg.length.mismatch)),(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(boolean), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.not.a.functional.intf: boolean))),(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(boolean,boolean), (compiler.misc.arg.length.mismatch)),(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(boolean,boolean,boolean), (compiler.misc.arg.length.mismatch)),(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(boolean,java.lang.Object,java.lang.Object), (compiler.misc.arg.length.mismatch))} +T8065986b.java:25:9: compiler.err.cant.apply.symbols: kindname.constructor, T8065986b, @516,{(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(), (compiler.misc.arg.length.mismatch)),(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(boolean), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.not.a.functional.intf: boolean))),(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(boolean,boolean), (compiler.misc.arg.length.mismatch)),(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(boolean,boolean,boolean), (compiler.misc.arg.length.mismatch)),(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(boolean,java.lang.Object,java.lang.Object), (compiler.misc.arg.length.mismatch))} +T8065986b.java:29:9: compiler.err.cant.apply.symbols: kindname.constructor, T8065986b, @603,{(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(), (compiler.misc.arg.length.mismatch)),(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(boolean), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.type.in.conditional: (compiler.misc.inconvertible.types: java.lang.Object, boolean)))),(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(boolean,boolean), (compiler.misc.arg.length.mismatch)),(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(boolean,boolean,boolean), (compiler.misc.arg.length.mismatch)),(compiler.misc.inapplicable.method: kindname.constructor, T8065986b, T8065986b(boolean,java.lang.Object,java.lang.Object), (compiler.misc.arg.length.mismatch))} +5 errors