Bug 70053 - [1.5] VerifyError - incompatible argument to function
Summary: [1.5] VerifyError - incompatible argument to function
Status: RESOLVED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 3.0   Edit
Hardware: PC Windows XP
: P3 normal (vote)
Target Milestone: 3.1 M1   Edit
Assignee: Philipe Mulet CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2004-07-14 15:12 EDT by Stefan Matthias Aust CLA
Modified: 2005-01-11 11:01 EST (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Stefan Matthias Aust CLA 2004-07-14 15:12:23 EDT
Latest Cheetah from CVS, JDK 5.0 b57.  I get strange errors

Exception in thread "main" java.lang.VerifyError: (class: xxx/XXX, method:
getZZZ signature: (Lxxx/YYY;)Ljava/lang/String;) Incompatible argument to function
	at xxx.Main.main(Main.java:8)

when adding ``log.info("got:\n" + trigger.toXML());'' to method getZZZ (I had to
obfuscate the package and class and method names).  ``log'' is a log4j-1.2.8
static Logger variable.

When compiling with javac, there's no problem.

Below is the problematic method.  Unfortunately, I can't provide the code and
wasn't able to create a small test case to reproduce the problem. 



public java.lang.String getZZZ(xxx.YYY);
  Code:
   0:	getstatic	#23; //Field log:Lorg/apache/log4j/Logger;
   3:	new	#35; //class java/lang/StringBuilder
   6:	dup
   7:	ldc	#60; //String triggering getRightsObject() for cid=
   9:	invokespecial	#40; //Method
java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
   12:	aload_1
   13:	invokevirtual	#65; //Method xxx/AAA.getCID:()Ljava/lang/String;
   16:	invokevirtual	#44; //Method
java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   19:	ldc	#67; //String , roid=
   21:	invokevirtual	#44; //Method
java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   24:	aload_1
   25:	invokevirtual	#71; //Method xxx/AAA.getROIDs:()Ljava/util/List;
   28:	iconst_0
   29:	invokeinterface	#77,  2; //InterfaceMethod
java/util/List.get:(I)Ljava/lang/Object;
   34:	invokevirtual	#44; //Method
java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   37:	invokevirtual	#50; //Method
java/lang/StringBuilder.toString:()Ljava/lang/String;
   40:	invokevirtual	#54; //Method
org/apache/log4j/Logger.info:(Ljava/lang/Object;)V
   43:	getstatic	#23; //Field log:Lorg/apache/log4j/Logger;
   46:	new	#35; //class java/lang/StringBuilder
   49:	dup
   50:	ldc	#79; //String got:\n
   52:	invokespecial	#40; //Method
java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
   55:	aload_1
   56:	invokevirtual	#82; //Method xxx/AAA.toXML:()Ljava/lang/String;
   59:	invokevirtual	#44; //Method
java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   62:	invokevirtual	#50; //Method
java/lang/StringBuilder.toString:()Ljava/lang/String;
   65:	invokevirtual	#54; //Method
org/apache/log4j/Logger.info:(Ljava/lang/Object;)V
   68:	aload_0
   69:	getfield	#84; //Field riContext:Lxxx/BBB;
   72:	ifnull	92
   75:	aload_0
   76:	getfield	#84; //Field riContext:Lxxx/BBB;
   79:	invokevirtual	#89; //Method xxx/BBB.getRIID:()Ljava/lang/String;
   82:	aload_1
   83:	invokevirtual	#90; //Method xxx/AAA.getRIID:()Ljava/lang/String;
   86:	invokevirtual	#96; //Method java/lang/String.equals:(Ljava/lang/Object;)Z
   89:	ifne	109
Comment 1 Philipe Mulet CLA 2004-07-20 12:18:00 EDT
Cannot reproduce. I tried the following testcase inferred from given 
information, please advise for reproducing it. 
Also, can you reproduce the issue with latest HEAD contents ?

import java.util.*;
public class X {
  public static void main(String[] args) {
    YYY y = new YYY();
    System.out.println(
      new StringBuilder("triggering getRightsobject() for cid=")
        .append(y.getCID())
        .append(", roid=")
        .append(y.getROIDs().get(0))
        .toString());
    System.out.println(
      new StringBuilder("got:\n")
        .append(y.toXML())
        .toString());
  }
}

class YYY extends AAA {
}

class AAA {
  String getCID() {	
    return "[cid]";
  }
  List<String> getROIDs() { 
    ArrayList<String> als = new ArrayList<String>(1);
    als.add("[roid]");
    return als;
  }
  String toXML() {
    return "[xml]";
  }
}



Comment 2 Stefan Matthias Aust CLA 2004-07-21 03:53:37 EDT
Philippe, your code works for me but I managed to modify and further simplify
the example and reproduce the problem:

 java.lang.VerifyError: (class: A, method: main signature:
([Ljava/lang/String;)V) Incompatible argument to function

Here's the faulty code:

import java.util.*;

public class A {
 public static void main(String[] args) {
  A a = new A();
  System.out.println("-" + a.a() + "-" + a.b().get(0) + "-" + a.a() + "-");
 }
 String a() { return ""; }
 List<String> b() { 
  ArrayList<String> als = new ArrayList<String>(1);
  als.add(a());
  return als;
 }
}

Using latest CVS and 5.0 b57.

If I remove the "get(0)" the code works.
If I remove the "<String>" from b's signature, the code works.

If you decompile the class file

 32:  aload_1
 33:  invokevirtual   #41; //Method b:()Ljava/util/List;
 36:  iconst_0
 37:  invokeinterface #47,  2; //InterfaceMethod
java/util/List.get:(I)Ljava/lang/Object;
 42:  invokevirtual   #37; //Method
java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

you should notice that List#get() returns a Object but the
StringBuilder#append() method expects a string.  Either a cast is missing or a
different append() method must be chosen.

Hope this helps to fix the bug :)
Comment 3 Philipe Mulet CLA 2004-07-21 06:35:24 EDT
String concatenation was indeed missing generic cast generation.
Added regression test: GenericTypeTest#test254.
Fixed