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) {
|
||||
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>
|
||||
|
||||
|
|
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