RFR: 8325859: potential information loss during type inference [v3]
Maurizio Cimadamore
mcimadamore at openjdk.org
Thu May 15 15:58:05 UTC 2025
On Fri, 2 May 2025 20:28:06 GMT, Vicente Romero <vromero at openjdk.org> wrote:
>> When an inference context (`IC`) is minimized, the minimized inference context (`MIC`) contains a proper subset of `IC's` inference vars (`IC_IV`). In other words there will be at least one inference variable `T` that belongs to `IC_IV` which doesn't belong to the minimized context inference variable's set (`MIC_IV`). MIC can be propagated to another inference context (AIC) as part of the type inference algo. If at any moment a type containing `T` needs, for example, to be instantiated `AIC` won't be able to perform that operation as it lacks the information to realize that `T` is a free variable it was supposed to know about hadn't a minimization step been performed. This PR is proposing to fix this issue without reducing the universe of inference contexts we apply the minimization algo to.
>>
>> We are basically proposing to add a field to class InferenceContext which will be supplementary inference context that can be used to look for additional information if necessary. Also when registering a free type listener to an inference context, it could be that it won't be registered in the inference context the client could expect but in a supplementary inference context if it is found out that it contains and instantiation to all the free variables related to the listener. See also some comments inlined in the code,
>>
>> TIA
>
> Vicente Romero has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains four additional commits since the last revision:
>
> - Merge branch 'master' into JDK-8325859
> - make visitor static
> - updating doc
> - 8325859: potential information loss during type inference
> > right I was writing a very similar example, and X is not replaced because the minimized inference context doesn't know about X
>
> That is true -- however, when we create the minimized context, we set a listener from the minimized context to the original context, so that whenever _any_ propagated variable is solved, we also solve the "independent" variables. This listener works -- the problem is that the replacement in the inferred method signature never occurs. So I'd like to spend some more time understanding exactly why this happens.
It also seems to me that this problem has been there for a long time -- possibly since the introduction of `InferenceContext::min` -- we do all the correct checks, but some of the types are left "uninferred" in the AST. Which then shows up whenever the translation strategy relies on the type being inferred (such as here -- as we need the inferred type to know which vararg array to create).
-------------
PR Comment: https://git.openjdk.org/jdk/pull/25011#issuecomment-2884328829
More information about the compiler-dev
mailing list