mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 11:04:34 +02:00
6729401: Compiler error when using F-bounded generics with free type variables
Javac applies wrong substitution to recursive type-variable bounds Reviewed-by: jjg
This commit is contained in:
parent
c5d6131368
commit
4021098c46
2 changed files with 54 additions and 5 deletions
|
@ -2131,9 +2131,6 @@ public class Types {
|
||||||
List<Type> to) {
|
List<Type> to) {
|
||||||
if (tvars.isEmpty())
|
if (tvars.isEmpty())
|
||||||
return tvars;
|
return tvars;
|
||||||
if (tvars.tail.isEmpty())
|
|
||||||
// fast common case
|
|
||||||
return List.<Type>of(substBound((TypeVar)tvars.head, from, to));
|
|
||||||
ListBuffer<Type> newBoundsBuf = lb();
|
ListBuffer<Type> newBoundsBuf = lb();
|
||||||
boolean changed = false;
|
boolean changed = false;
|
||||||
// calculate new bounds
|
// calculate new bounds
|
||||||
|
@ -2173,8 +2170,14 @@ public class Types {
|
||||||
Type bound1 = subst(t.bound, from, to);
|
Type bound1 = subst(t.bound, from, to);
|
||||||
if (bound1 == t.bound)
|
if (bound1 == t.bound)
|
||||||
return t;
|
return t;
|
||||||
else
|
else {
|
||||||
return new TypeVar(t.tsym, bound1, syms.botType);
|
// 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>
|
// </editor-fold>
|
||||||
|
|
||||||
|
|
46
langtools/test/tools/javac/generics/6729401/T6729401.java
Normal file
46
langtools/test/tools/javac/generics/6729401/T6729401.java
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue