RFR: universal type variables: initial prototype [v3]

Maurizio Cimadamore mcimadamore at openjdk.java.net
Tue Aug 10 21:27:40 UTC 2021


On Tue, 10 Aug 2021 19:10:14 GMT, Vicente Romero <vromero at openjdk.org> wrote:

>> First iteration of the protype for universal type variables
>
> Vicente Romero has updated the pull request incrementally with one additional commit since the last revision:
> 
>   second iteration of review comments

src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java line 1186:

> 1184:                      return isSubtypeNoCapture(t.getUpperBound(), s);
> 1185:                  case BOT:
> 1186:                      if (allowUniversalTVars && s.hasTag(TYPEVAR) && ((TypeVar)s).isValueProjection()) {

I agree that here you need `isValueProjection`

src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java line 3614:

> 3612:                 }
> 3613:                 if (allowUniversalTVars &&
> 3614:                         !t.isValueProjection() &&

Not sure about this here - "not value projection might also mean it's a regular tvar". Doesn't this test want to check for `T.ref` (in which case you should check for `isReferenceProjection`

src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java line 3616:

> 3614:                         !t.isValueProjection() &&
> 3615:                         from.head.hasTag(TYPEVAR) &&
> 3616:                         ((TypeVar)from.head).projection != null &&

Shouldn't this test be `isUniversal()` ?

src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java line 3617:

> 3615:                         from.head.hasTag(TYPEVAR) &&
> 3616:                         ((TypeVar)from.head).projection != null &&
> 3617:                         t.equalsIgnoreMetadata(((TypeVar)from.head).projection)) {

and here, we should call `referencceProjection()` ?

src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java line 2663:

> 2661:                         && ((JCFieldAccess)tree.meth).selected.hasTag(IDENT)
> 2662:                         && TreeInfo.name(((JCFieldAccess)tree.meth).selected) == names._super;
> 2663:                 boolean qualifierIsUniversal = allowUniversalTVars && qualifier.hasTag(TYPEVAR) && ((TypeVar)qualifier).isValueProjection();

This should be `isUniversal()` I think - `wait` and friends should warn, even on `.ref` stuff.

src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java line 4600:

> 4598:                 throw new AssertionError(tree);
> 4599:             case TYPEVAR:
> 4600:                 if (allowUniversalTVars && name == names.ref && ((TypeVar)site).isValueProjection()) {

This should be `isUniversal()` ?

src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java line 5149:

> 5147:             argTypes2 = argTypes = attribAnyTypes(args, env);
> 5148:             for (Type t : ((ClassType) clazztype.tsym.type).typarams_field) {
> 5149:                 argTypes.head = chk.checkRefType(args.head.pos(), argTypes.head, ((TypeVar) t).isValueProjection());

this should be `isUniversal()`, no?

-------------

PR: https://git.openjdk.java.net/valhalla/pull/521


More information about the valhalla-dev mailing list