Mercurial > hg > openjdk > jdk7u > langtools
changeset 1133:5842b848a41a
7123100: javac fails with java.lang.StackOverflowError
Summary: Inference of under-constrained type-variables creates erroneous recursive wildcard types
Reviewed-by: mcimadamore
author | dmeetry |
---|---|
date | Wed, 25 Jan 2012 08:17:32 +0400 |
parents | 4b1503723257 |
children | cfdc1b1c4c86 |
files | src/share/classes/com/sun/tools/javac/comp/Infer.java test/tools/javac/cast/7123100/T7123100a.java test/tools/javac/cast/7123100/T7123100a.out test/tools/javac/cast/7123100/T7123100b.java test/tools/javac/cast/7123100/T7123100b.out test/tools/javac/cast/7123100/T7123100c.java test/tools/javac/cast/7123100/T7123100c.out test/tools/javac/cast/7123100/T7123100d.java test/tools/javac/cast/7123100/T7123100d.out |
diffstat | 9 files changed, 85 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/com/sun/tools/javac/comp/Infer.java Tue Jan 24 17:09:13 2012 +0400 +++ b/src/share/classes/com/sun/tools/javac/comp/Infer.java Wed Jan 25 08:17:32 2012 +0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, 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 @@ -336,25 +336,29 @@ //replace uninferred type-vars targs = types.subst(targs, that.tvars, - instaniateAsUninferredVars(undetvars, that.tvars)); + instantiateAsUninferredVars(undetvars, that.tvars)); } return chk.checkType(warn.pos(), that.inst(targs, types), to); } //where - private List<Type> instaniateAsUninferredVars(List<Type> undetvars, List<Type> tvars) { + private List<Type> instantiateAsUninferredVars(List<Type> undetvars, List<Type> tvars) { + Assert.check(undetvars.length() == tvars.length()); ListBuffer<Type> new_targs = ListBuffer.lb(); - //step 1 - create syntethic captured vars + //step 1 - create synthetic captured vars for (Type t : undetvars) { UndetVar uv = (UndetVar)t; Type newArg = new CapturedType(t.tsym.name, t.tsym, uv.inst, syms.botType, null); new_targs = new_targs.append(newArg); } //step 2 - replace synthetic vars in their bounds + List<Type> formals = tvars; for (Type t : new_targs.toList()) { CapturedType ct = (CapturedType)t; ct.bound = types.subst(ct.bound, tvars, new_targs.toList()); - WildcardType wt = new WildcardType(ct.bound, BoundKind.EXTENDS, syms.boundClass); + WildcardType wt = new WildcardType(syms.objectType, BoundKind.UNBOUND, syms.boundClass); + wt.bound = (TypeVar)formals.head; ct.wildcard = wt; + formals = formals.tail; } return new_targs.toList(); }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/cast/7123100/T7123100a.java Wed Jan 25 08:17:32 2012 +0400 @@ -0,0 +1,16 @@ +/* + * @test /nodynamiccopyright/ + * @bug 7123100 + * @summary javac fails with java.lang.StackOverflowError + * @compile/fail/ref=T7123100a.out -Werror -Xlint:unchecked -XDrawDiagnostics T7123100a.java + */ + +class T7123100a { + <E extends Enum<E>> E m() { + return null; + } + + <Z> void test() { + Z z = (Z)m(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/cast/7123100/T7123100a.out Wed Jan 25 08:17:32 2012 +0400 @@ -0,0 +1,4 @@ +T7123100a.java:14:19: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), compiler.misc.type.captureof: 1, ?, Z +- compiler.err.warnings.and.werror +1 error +1 warning
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/cast/7123100/T7123100b.java Wed Jan 25 08:17:32 2012 +0400 @@ -0,0 +1,12 @@ +/* + * @test /nodynamiccopyright/ + * @bug 7123100 + * @summary javac fails with java.lang.StackOverflowError + * @compile/fail/ref=T7123100b.out -Werror -Xlint:unchecked -XDrawDiagnostics T7123100b.java + */ + +class T7123100b { + <Z> void test(Enum<?> e) { + Z z = (Z)e; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/cast/7123100/T7123100b.out Wed Jan 25 08:17:32 2012 +0400 @@ -0,0 +1,4 @@ +T7123100b.java:10:18: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), java.lang.Enum<compiler.misc.type.captureof: 1, ?>, Z +- compiler.err.warnings.and.werror +1 error +1 warning
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/cast/7123100/T7123100c.java Wed Jan 25 08:17:32 2012 +0400 @@ -0,0 +1,16 @@ +/* + * @test /nodynamiccopyright/ + * @bug 7123100 + * @summary javac fails with java.lang.StackOverflowError + * @compile/fail/ref=T7123100c.out -Werror -Xlint:unchecked -XDrawDiagnostics T7123100c.java + */ + +class T7123100c { + <E> E m(E e) { + return null; + } + + <Z> void test(Enum<?> e) { + Z z = (Z)m(e); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/cast/7123100/T7123100c.out Wed Jan 25 08:17:32 2012 +0400 @@ -0,0 +1,4 @@ +T7123100c.java:14:19: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), java.lang.Enum<compiler.misc.type.captureof: 1, ?>, Z +- compiler.err.warnings.and.werror +1 error +1 warning
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/cast/7123100/T7123100d.java Wed Jan 25 08:17:32 2012 +0400 @@ -0,0 +1,16 @@ +/* + * @test /nodynamiccopyright/ + * @bug 7123100 + * @summary javac fails with java.lang.StackOverflowError + * @compile/fail/ref=T7123100d.out -Werror -Xlint:unchecked -XDrawDiagnostics T7123100d.java + */ + +class T7123100d { + <E extends Enum<E>> E m(Enum<E> e) { + return null; + } + + <Z> void test(Enum<?> e) { + Z z = (Z)m(e); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/cast/7123100/T7123100d.out Wed Jan 25 08:17:32 2012 +0400 @@ -0,0 +1,4 @@ +T7123100d.java:14:19: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), compiler.misc.type.captureof: 1, ?, Z +- compiler.err.warnings.and.werror +1 error +1 warning