8004099: Bad compiler diagnostic generated when poly expression is passed to non-existent method
Summary: Some code paths in resolve do not use methodArguments to correctly format actuals
Reviewed-by: jjg
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Mon Dec 17 07:47:05 2012 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Mon Dec 17 16:13:01 2012 +0000
@@ -1405,7 +1405,8 @@
Type owntype = standaloneConditional ? condType(tree, truetype, falsetype) : pt();
if (condtype.constValue() != null &&
truetype.constValue() != null &&
- falsetype.constValue() != null) {
+ falsetype.constValue() != null &&
+ !owntype.hasTag(NONE)) {
//constant folding
owntype = cfolder.coerce(condtype.isTrue() ? truetype : falsetype, owntype);
}
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Mon Dec 17 07:47:05 2012 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Mon Dec 17 16:13:01 2012 +0000
@@ -3064,16 +3064,20 @@
if (hasLocation) {
return diags.create(dkind, log.currentSource(), pos,
errKey, kindname, idname, //symbol kindname, name
- typeargtypes, argtypes, //type parameters and arguments (if any)
+ typeargtypes, args(argtypes), //type parameters and arguments (if any)
getLocationDiag(location, site)); //location kindname, type
}
else {
return diags.create(dkind, log.currentSource(), pos,
errKey, kindname, idname, //symbol kindname, name
- typeargtypes, argtypes); //type parameters and arguments (if any)
+ typeargtypes, args(argtypes)); //type parameters and arguments (if any)
}
}
//where
+ private Object args(List<Type> args) {
+ return args.isEmpty() ? args : methodArguments(args);
+ }
+
private String getErrorKey(KindName kindname, boolean hasTypeArgs, boolean hasLocation) {
String key = "cant.resolve";
String suffix = hasLocation ? ".location" : "";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/lambda/BadMethodCall2.java Mon Dec 17 16:13:01 2012 +0000
@@ -0,0 +1,13 @@
+/**
+ * @test /nodynamiccopyright/
+ * @bug 8004099
+ * @summary Bad compiler diagnostic generated when poly expression is passed to non-existent method
+ * @compile/fail/ref=BadMethodCall2.out -XDrawDiagnostics BadMethodCall2.java
+ */
+class BadMethodCall2 {
+ void test(Object rec) {
+ rec.nonExistent(System.out::println);
+ rec.nonExistent(()->{});
+ rec.nonExistent(true ? "1" : "2");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/lambda/BadMethodCall2.out Mon Dec 17 16:13:01 2012 +0000
@@ -0,0 +1,4 @@
+BadMethodCall2.java:9:13: compiler.err.cant.resolve.location.args: kindname.method, nonExistent, , @310, (compiler.misc.location.1: kindname.variable, rec, java.lang.Object)
+BadMethodCall2.java:10:13: compiler.err.cant.resolve.location.args: kindname.method, nonExistent, , @357, (compiler.misc.location.1: kindname.variable, rec, java.lang.Object)
+BadMethodCall2.java:11:13: compiler.err.cant.resolve.location.args: kindname.method, nonExistent, , @391, (compiler.misc.location.1: kindname.variable, rec, java.lang.Object)
+3 errors