hg: jdk7/tl/langtools: 6979683: inconsistent interaction of reference cast with box/unbox conversions leaves out a useful case

Vicente-Arturo Romero-Zaldivar vicente.romero at oracle.com
Thu Sep 12 01:53:03 PDT 2013


On 11/09/13 22:10, Alex Buckley wrote:
> Hollis,
>
> Thanks for trying the code on Oracle JDK 1.6. It was a little 
> confusing earlier when you said "latest JDK accepts the following 
> code", because the latest JDK (whether Oracle or Open) is 8 and it 
> does not accept the code.
>
> The problem is that JDK 7 (it'll be both Oracle and Open) accepts the 
> code. Per JLS7, the code should not be accepted.
>
> Vicente,
>
> I think the changeset for 6979683 in JDK 7 made changes to the == 
> operator which were undone by a changeset for JDK 8. It is right that 
> the changes were undone, but I'd still like to know when and why. At 
> minimum, there should be a javac bug with label release-note=YES so 
> that the illegality of 3==x in 8 (v. in 7) is documented. Can you look 
> into that please?

Hi Alex,

Yes as you mentioned the patch for bug: 
http://bugs.sun.com/view_bug.do?bug_id=8013357 made changes to the == 
operator. In our bug system the corresponding bug entry has the 
release-note=YES label. The changeset is in the master repo since last July.

Vicente

>
> Alex
>
> On 9/11/2013 1:42 PM, Hollis Waite wrote:
>> Oracle JDK 1.7.0_25 accepts both "3==x" & "x==3". Oracle JDK 1.6.0_45 
>> rejects both. Eclipse rejects the code for all versions. I'm not sure 
>> what OpenJDK does. As indicated in my previous e-mail, I was talking 
>> this over with an Eclipse engineer and he agrees that it should be 
>> consistently rejected for all versions of spec. It sounds like you're 
>> in agreement. Based upon 
>> http://bugs.sun.com/view_bug.do?bug_id=6526449, it seems that Oracle 
>> may feel differently. I reached out to this mailing list to try and 
>> get everyone on the same page. Below matrix indicates my findings so 
>> far:
>>
>>           6  7  8
>> Eclipse  N  N  ?
>>
>> OpenJDK  ?  ?  ?
>> Oracle   N  Y  ?
>>
>>
>> ----- Original Message -----
>> From: Alex Buckley <alex.buckley at oracle.com>
>> To: "compiler-dev at openjdk.java.net" <compiler-dev at openjdk.java.net>
>> Cc:
>> Sent: Wednesday, September 11, 2013 2:39 PM
>> Subject: Re: hg: jdk7/tl/langtools: 6979683: inconsistent interaction 
>> of    reference cast with box/unbox conversions leaves out a useful case
>>
>> I don't understand the problem. JLS7 says 3==x is illegal; JLS8 is not
>> changing in this area; JDK8 rejects the code.
>>
>> The past is always of tremendous importance in language/compiler work. I
>> reported JDK-6526449 shortly after JDK6 was released because javac's
>> behavior for x==3 was different than 3==x, which is Really Bad.
>> Unfortunately:
>>
>> 1. My report was confusing - casting conversion is a red herring because
>> JLS 15.21.3 has never allowed a mix of int and Object types, even if int
>> subsequently became castable to Object (and Object to int).
>>
>> 2. The evaluation was confusing - does "Fixed by 6979683" mean "x==3 and
>> 3==x are now both rejected" or "x==3 and 3==x are now both accepted" ? I
>> suspect the former, which is why I'm concerned that you say you have a
>> JDK which accepts 3==x. Please say more about the JDK version.
>>
>> Alex
>>
>> On 9/11/2013 11:54 AM, Hollis Waite wrote:
>>> Wasn't my intention to dredge up the past. However, I was looking 
>>> for some guidance with respect to an Eclipse bug 
>>> (https://bugs.eclipse.org/bugs/show_bug.cgi?id=416950). It sounds 
>>> like you're confirming that Oracle JRE 7 behavior (i.e. accepting 
>>> primitive/Object comparisons) is invalid? I can't imagine that we're 
>>> cool with inconsistent behavior between JDK implementations. 
>>> *Someone* has to be wrong.
>>>
>>>
>>> ----- Original Message -----
>>> From: Alex Buckley <alex.buckley at oracle.com>
>>> To: "compiler-dev at openjdk.java.net" <compiler-dev at openjdk.java.net>
>>> Cc:
>>> Sent: Wednesday, September 11, 2013 1:43 PM
>>> Subject: Re: hg: jdk7/tl/langtools: 6979683: inconsistent 
>>> interaction of    reference cast with box/unbox conversions leaves 
>>> out a useful case
>>>
>>> Please be more specific than "latest JDK". In the JDK 8 Developer
>>> Preview, the 3==x comparison is rejected with the message that int and
>>> Object are incomparable types. That is consistent with JLS7 15.21.
>>>
>>> Now, this topic has some history. It used to be that javac was 
>>> sensitive
>>> to the order of the operands; see JDK-6526449. I happen to agree with
>>> you that == should accept a mix of primitive and reference types,
>>> provided that casting conversion can convert one type to the other.
>>> However, it didn't happen in SE 7 (hence 3==x is rejected) and we're 
>>> not
>>> revisiting it now.
>>>
>>> Alex
>>>
>>> On 9/11/2013 9:29 AM, Hollis Waite wrote:
>>>> Since Java 7 allows implicit chained casts, should it be legal to 
>>>> compare primitives with Objects via the '==' operator? JLS 15.21 
>>>> states:
>>>>
>>>>
>>>>        The equality operators may be used to compare two operands that
>>>>        are convertible (§5.1.8) to numeric type, or two operands of
>>>>        type boolean or Boolean, or two operands that are each of 
>>>> either
>>>>        reference type or the null type. All other cases result in a
>>>>        compile-time error.
>>>>
>>>> However, latest JDK accepts the below code:
>>>>
>>>>        Object x = "";
>>>>        boolean a = (3 == x);
>>>>
>>>> It seems to me that the new '=' guidelines are inconsistent with 
>>>> official (but not *actual*) behavior of '=='. Should JLS 15.21 be 
>>>> updated?
>>>>
>>>
>>



More information about the compiler-dev mailing list