RFR JDK-8206142: type inference: javac is incorrectly applying capture conversion during incorporation

Vicente Romero vicente.romero at oracle.com
Mon Jul 23 13:22:18 UTC 2018



On 07/21/2018 09:49 AM, B. Blaser wrote:
> Hi Vicente,
>
> On 20 July 2018 at 22:27, Vicente Romero <vicente.romero at oracle.com> wrote:
>> Hi all,
>>
>> Please review the patch to fix [1] at [2]. The fix is putting javac in sync
>> with the spec by not applying capture conversion during incorporation.
>>
>> Thanks,
>> Vicente
>>
>> [1] https://bugs.openjdk.java.net/browse/JDK-8206142
>> [2] http://cr.openjdk.java.net/~vromero/8206142/webrev.00/jdk.dev.patch
> It's hard to measure the potential side-effects of this fix,

yes, I'm also worried about the possible side effects. I agree that more 
discussion will be needed,

>   but it
> seems good to me even if you'll probably need another review.
> Maybe, I'd rewrite it as next to avoid creating a new method?
>
> Thanks,
> Bernard

Thanks,
Vicente

>
>
> diff -r b0fcf59be391
> src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java
> --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java
>         Fri Jul 20 14:48:41 2018 -0700
> +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java
>         Sat Jul 21 14:33:05 2018 +0200
> @@ -1003,24 +1003,24 @@
>        * Is t an unchecked subtype of s?
>        */
>       public boolean isSubtypeUnchecked(Type t, Type s, Warner warn) {
> -        boolean result = isSubtypeUncheckedInternal(t, s, true, warn);
> +        boolean result = isSubtypeUnchecked(t, s, true, warn);
>           if (result) {
>               checkUnsafeVarargsConversion(t, s, warn);
>           }
>           return result;
>       }
>       //where
> -        private boolean isSubtypeUncheckedInternal(Type t, Type s,
> boolean capture, Warner warn) {
> +        public boolean isSubtypeUnchecked(Type t, Type s, boolean
> capture, Warner warn) {
>               if (t.hasTag(ARRAY) && s.hasTag(ARRAY)) {
>                   if (((ArrayType)t).elemtype.isPrimitive()) {
>                       return isSameType(elemtype(t), elemtype(s));
>                   } else {
> -                    return isSubtypeUncheckedInternal(elemtype(t),
> elemtype(s), false, warn);
> +                    return isSubtypeUnchecked(elemtype(t),
> elemtype(s), false, warn);
>                   }
>               } else if (isSubtype(t, s, capture)) {
>                   return true;
>               } else if (t.hasTag(TYPEVAR)) {
> -                return isSubtypeUncheckedInternal(t.getUpperBound(),
> s, false, warn);
> +                return isSubtypeUnchecked(t.getUpperBound(), s, false, warn);
>               } else if (!s.isRaw()) {
>                   Type t2 = asSuper(t, s.tsym);
>                   if (t2 != null && t2.isRaw()) {
> diff -r b0fcf59be391
> src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Infer.java
> --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Infer.java
>         Fri Jul 20 14:48:41 2018 -0700
> +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Infer.java
>         Sat Jul 21 14:33:05 2018 +0200
> @@ -1180,7 +1180,7 @@
>           IS_SUBTYPE() {
>               @Override
>               boolean apply(Type op1, Type op2, Warner warn, Types types) {
> -                return types.isSubtypeUnchecked(op1, op2, warn);
> +                return types.isSubtypeUnchecked(op1, op2, false, warn);
>               }
>           },
>           IS_SAME_TYPE() {



More information about the compiler-dev mailing list