The following code (to be attached) contains two loops, one of which is
miscompiled.

The first is an enhanced for loop, the second is the same loop, but manually
desugared accorded to the JLS (JLS 3, section 14.14.2
http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.14.2).

The two loops should therefore behave identically.  They do not; the first loop
[incorrectly] finishes normally, the second loop [correctly] throws a class
cast exception.

The issue is that according to the JLS,

   for (String s:u) ...

gets desugarred to

   for (Type i = u.iterator(); i.hasNext(); ) { String s = i.next(); ... }

where Type is the type of u.iterator().

However, after erasing generics, the initialisation of the loop variable i
potentially requires a cast (after erase, in this case, u.iterator() has
compile-time type Iterator, while the variable has type MyIterator).

It appears that gcj does not insert the required cast.

(Both Sun javac and eclipse get this wrong also, in an identical manner.  It is
possible that Sun will decide to change the JLS to match the compiler
behaviour?)


-- 
           Summary: Incorrect code generated for enhanced for loop.
           Product: gcc
           Version: 4.4.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: java
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: suckfish at ihug dot co dot nz
  GCC host triplet: x86_64-redhat-linux


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42892

Reply via email to