Community
Participate
Working Groups
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
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]"; } }
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 :)
String concatenation was indeed missing generic cast generation. Added regression test: GenericTypeTest#test254. Fixed