提交 74211082 编写于 作者: M mcimadamore

6729401: Compiler error when using F-bounded generics with free type variables

Summary: Javac applies wrong substitution to recursive type-variable bounds
Reviewed-by: jjg
上级 9bdca39e
......@@ -2131,9 +2131,6 @@ public class Types {
List<Type> to) {
if (tvars.isEmpty())
return tvars;
if (tvars.tail.isEmpty())
// fast common case
return List.<Type>of(substBound((TypeVar)tvars.head, from, to));
ListBuffer<Type> newBoundsBuf = lb();
boolean changed = false;
// calculate new bounds
......@@ -2173,8 +2170,14 @@ public class Types {
Type bound1 = subst(t.bound, from, to);
if (bound1 == t.bound)
return t;
else
return new TypeVar(t.tsym, bound1, syms.botType);
else {
// create new type variable without bounds
TypeVar tv = new TypeVar(t.tsym, null, syms.botType);
// the new bound should use the new type variable in place
// of the old
tv.bound = subst(bound1, List.<Type>of(t), List.<Type>of(tv));
return tv;
}
}
// </editor-fold>
......
/*
* Copyright 2008 Sun Microsystems, Inc. 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/*
* @test
* @bug 6729401
*
* @summary Compiler error when using F-bounded generics with free type variables
* @author Maurizio Cimadamore
* @compile T6729401.java
*
*/
class T6729401 {
interface I<U,W> {
<T extends I<U,T>> void m(I<U,T> x);
}
<X extends I<Object,X>,Y extends I<Object,Y>> void test(I<Object,X> x, I<Object,Y> y) {
x.<Y>m(y);
x.m(y);
y.<X>m(x);
y.m(x);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册