Incoherent invocation type inference?

B. Blaser bsrbnd at gmail.com
Wed Jan 18 12:50:00 UTC 2017


Hi,

2017-01-16 19:33 GMT+01:00 B. Blaser <bsrbnd at gmail.com>:
> 2017-01-16 18:03 GMT+01:00 Maurizio Cimadamore <maurizio.cimadamore at oracle.com>:
>>
>> On 16/01/17 16:49, B. Blaser wrote:
>>>
>>> Intersections seem to be dangerous only in the case of a naked return
>>> type variable with no parameter provided ("get()" or "get(null)")
>>> because get() wouldn't know about the return type constraints. We
>>> could, for example, update the rule as follows: "emit a lint warning
>>> if the return type T is a naked type variable infered to an
>>> intersection type and no constraint is given by the actual arguments"?
>>>
>>> Or are you suggesting to modify the rules of intersection types on the
>>> language side?
>>
>> I think the Lint warning makes sense for naked return type regardless of
>> intersections - as in the example I wrote.
>
> Ok for this first rule.

What do you think of something like the draft below
(Infer.instantiateMethod() upon rev. b6960e2da008)?
Thanks,
Bernard

>> Maurizio

diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Infer.java
b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Infer.java
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Infer.java
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Infer.java
@@ -182,6 +182,26 @@
         final InferenceContext inferenceContext = new
InferenceContext(this, tvars);  //B0
         inferenceException.clear();
         try {
+            if (resultInfo != null && resultInfo.pt != Type.noType &&
mt.restype.hasTag(TYPEVAR)) {
+                int nbConstraints = 0;
+                if (mt.argtypes.length() == argtypes.length()) {
+                    for (int i=0; i<mt.argtypes.length(); i++) {
+                        Type pType = mt.argtypes.get(i);
+                        Type aType = argtypes.get(i);
+                        if (pType.contains(mt.restype) && aType !=
syms.botType)
+                            nbConstraints++;
+                    }
+                }
+                if (nbConstraints == 0) {
+                    chk.warnUnchecked(env.tree.pos(),
+                           "unchecked.invocation.type.inference",
+                           Kinds.kindName(msym),
+                           msym.name,
+                           Kinds.kindName(msym.location()),
+                           msym.location());
+                }
+            }
+
             DeferredAttr.DeferredAttrContext deferredAttrContext =
                         resolveContext.deferredAttrContext(msym,
inferenceContext, resultInfo, warn);

diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties
b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties
@@ -1748,6 +1748,10 @@
     required: {2}\n\
     found: {3}

+# 0: symbol kind, 1: name, 2: symbol kind, 3: symbol
+compiler.warn.unchecked.invocation.type.inference=\
+    unchecked invocation type inference: {0} {1} in {2} {3} misses
constraints from actual arguments
+
 # 0: type
 compiler.warn.unchecked.generic.array.creation=\
     unchecked generic array creation for varargs parameter of type {0}


More information about the compiler-dev mailing list