langtools/test/tools/javac/types/GenericTypeWellFormednessTest.java
author ohair
Wed, 06 Apr 2011 20:33:44 -0700
changeset 9087 e9e44877cd18
parent 8037 b3f278fe95d6
child 30730 d3ce7619db2c
permissions -rw-r--r--
7033660: Update copyright year to 2011 on any files changed in 2011 Reviewed-by: dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8037
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
     1
/*
9087
e9e44877cd18 7033660: Update copyright year to 2011 on any files changed in 2011
ohair
parents: 8037
diff changeset
     2
 * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
8037
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
     4
 *
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
     7
 * published by the Free Software Foundation.
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
     8
 *
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    13
 * accompanied this code).
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    14
 *
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    18
 *
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    21
 * questions.
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    22
 */
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    23
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    24
/*
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    25
 * @test
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    26
 * @bug 7007432 7006109
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    27
 * @summary Test generic types well-formedness
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    28
 * @author mcimadamore
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    29
 * @library .
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    30
 * @run main GenericTypeWellFormednessTest
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    31
 */
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    32
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    33
import com.sun.tools.javac.code.BoundKind;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    34
import com.sun.tools.javac.code.Type;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    35
import com.sun.tools.javac.code.Type.*;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    36
import com.sun.tools.javac.code.Symbol;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    37
import com.sun.tools.javac.code.Symbol.*;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    38
import java.lang.reflect.Array;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    39
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    40
/**
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    41
 * Check parameterized type well-formedness. This test executes a number of checks
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    42
 * in order to establish as to whether an instantiation of a generic type conforms
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    43
 * to the generic class' declared bounds.
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    44
 */
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    45
public class GenericTypeWellFormednessTest extends TypeHarness {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    46
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    47
    static int executedCount = 0;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    48
    static int ignoredCount = 0;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    49
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    50
    InstantiableType[] rows;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    51
    Type[] columns;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    52
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    53
    static class InstantiableType {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    54
        protected Type type;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    55
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    56
        public InstantiableType(Type type) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    57
            this.type = type;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    58
        }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    59
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    60
        Type inst(Type clazz) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    61
            return type;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    62
        }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    63
    }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    64
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    65
    enum Result {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    66
        /* generic type is well-formed w.r.t. declared bounds */
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    67
        OK(true),
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    68
        /* generic type is not well-formed w.r.t. declared bounds */
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    69
        FAIL(false),
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    70
        /* generic type is not well-formed w.r.t. declared bounds according to the JLS 3rd,
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    71
         * but javac allows it (spec for generic type well-formedness is overly restrictive)
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    72
         * See regression test test/tools/generics/wildcards/T5097548.java
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    73
         */
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    74
        IGNORE(false);
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    75
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    76
        boolean value;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    77
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    78
        Result(boolean value) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    79
            this.value = value;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    80
        }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    81
    }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    82
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    83
    static final Result T = Result.OK;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    84
    static final Result F = Result.FAIL;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    85
    static final Result I = Result.IGNORE;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    86
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    87
    /*is a type in 'rows' a valid instantiation for the generic class in 'col' ? */
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    88
    Result[][] isValidInstantiation = {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    89
                     //Foo<X>, Foo<X ext Object>, Foo<X ext Number>, Foo<X ext Foo<X>>, Foo<X ext Foo<+X>>, Foo<X ext Foo<-X>>, Foo<X ext Foo<?>>
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    90
    /*Foo<Object>*/  { T     , T                , F                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    91
    /*Foo<Number>*/  { T     , T                , T                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    92
    /*Foo<Integer>*/ { T     , T                , T                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    93
    /*Foo<Double>*/  { T     , T                , T                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    94
    /*Foo<String>*/  { T     , T                , F                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    95
    /*Foo<X1>*/      { T     , T                , F                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    96
    /*Foo<X2>*/      { T     , T                , T                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    97
    /*Foo<X3>*/      { T     , T                , T                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    98
    /*Foo<X4>*/      { T     , T                , T                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
    99
    /*Foo<X5>*/      { T     , T                , F                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   100
    /*Foo<X6>*/      { T     , T                , F                , T                , T                 , T                 , T },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   101
    /*Foo<+Object>*/ { T     , T                , I                , I                , I                 , I                 , I },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   102
    /*Foo<+Number>*/ { T     , T                , T                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   103
    /*Foo<+Integer>*/{ T     , T                , T                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   104
    /*Foo<+Double>*/ { T     , T                , T                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   105
    /*Foo<+String>*/ { T     , T                , F                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   106
    /*Foo<+X1>*/     { T     , T                , F                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   107
    /*Foo<+X2>*/     { T     , T                , T                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   108
    /*Foo<+X3>*/     { T     , T                , T                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   109
    /*Foo<+X4>*/     { T     , T                , T                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   110
    /*Foo<+X5>*/     { T     , T                , F                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   111
    /*Foo<+X6>*/     { T     , T                , F                , T                , T                 , I                 , T },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   112
    /*Foo<-Object>*/ { T     , T                , F                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   113
    /*Foo<-Number>*/ { T     , T                , T                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   114
    /*Foo<-Integer>*/{ T     , T                , T                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   115
    /*Foo<-Double>*/ { T     , T                , T                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   116
    /*Foo<-String>*/ { T     , T                , F                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   117
    /*Foo<-X1>*/     { T     , T                , I                , I                , I                 , I                 , I },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   118
    /*Foo<-X2>*/     { T     , T                , I                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   119
    /*Foo<-X3>*/     { T     , T                , I                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   120
    /*Foo<-X4>*/     { T     , T                , I                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   121
    /*Foo<-X5>*/     { T     , T                , I                , F                , F                 , F                 , F },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   122
    /*Foo<-X6>*/     { T     , T                , F                , T                , I                 , I                 , T },
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   123
    /*Foo<?>*/       { T     , T                , T                , T                , T                 , T                 , T }};
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   124
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   125
    GenericTypeWellFormednessTest() {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   126
        InstantiableType[] basicTypes = {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   127
            new InstantiableType(predef.objectType),
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   128
            new InstantiableType(NumberType()),
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   129
            new InstantiableType(box(predef.intType)),
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   130
            new InstantiableType(box(predef.doubleType)),
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   131
            new InstantiableType(predef.stringType) };
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   132
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   133
        InstantiableType[] typeVars = new InstantiableType[basicTypes.length + 1];
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   134
        for (int i = 0 ; i < basicTypes.length ; i++) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   135
           typeVars[i] = new InstantiableType(fac.TypeVariable(basicTypes[i].type));
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   136
        }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   137
        typeVars[typeVars.length - 1] = new InstantiableType(null) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   138
            Type inst(Type clazz) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   139
                TypeVar tvar = fac.TypeVariable();
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   140
                tvar.bound = subst(clazz, Mapping(clazz.getTypeArguments().head, tvar));
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   141
                return tvar;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   142
            }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   143
        };
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   144
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   145
        InstantiableType[] typeArgs = join(InstantiableType.class, basicTypes, typeVars);
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   146
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   147
        InstantiableType[] invariantTypes = new InstantiableType[typeArgs.length];
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   148
        for (int i = 0 ; i < typeArgs.length ; i++) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   149
           final InstantiableType type1 = typeArgs[i];
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   150
           invariantTypes[i] = new InstantiableType(typeArgs[i].type) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   151
               Type inst(Type clazz) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   152
                   return subst(clazz, Mapping(clazz.getTypeArguments().head, type1.inst(clazz)));
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   153
               }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   154
            };
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   155
        }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   156
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   157
        InstantiableType[] covariantTypes = new InstantiableType[typeArgs.length];
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   158
        for (int i = 0 ; i < typeArgs.length ; i++) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   159
           final InstantiableType type1 = typeArgs[i];
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   160
           covariantTypes[i] = new InstantiableType(null) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   161
               Type inst(Type clazz) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   162
                   Type t = fac.Wildcard(BoundKind.EXTENDS, type1.inst(clazz));
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   163
                   return subst(clazz, Mapping(clazz.getTypeArguments().head, t));
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   164
               }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   165
            };
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   166
        }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   167
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   168
        InstantiableType[] contravariantTypes = new InstantiableType[typeArgs.length];
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   169
        for (int i = 0 ; i < typeArgs.length ; i++) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   170
           final InstantiableType type1 = typeArgs[i];
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   171
           contravariantTypes[i] = new InstantiableType(null) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   172
               Type inst(Type clazz) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   173
                   Type t = fac.Wildcard(BoundKind.SUPER, type1.inst(clazz));
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   174
                   return subst(clazz, Mapping(clazz.getTypeArguments().head, t));
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   175
               }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   176
            };
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   177
        }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   178
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   179
        InstantiableType[] bivariantTypes = {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   180
            new InstantiableType(fac.Wildcard(BoundKind.UNBOUND, predef.objectType)) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   181
               Type inst(Type clazz) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   182
                   return subst(clazz, Mapping(clazz.getTypeArguments().head, type));
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   183
               }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   184
            }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   185
        };
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   186
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   187
        rows = join(InstantiableType.class, invariantTypes, covariantTypes, contravariantTypes, bivariantTypes);
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   188
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   189
        Type tv1 = fac.TypeVariable();
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   190
        Type decl1 = fac.Class(tv1);
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   191
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   192
        Type tv2 = fac.TypeVariable(predef.objectType);
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   193
        Type decl2 = fac.Class(tv2);
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   194
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   195
        Type tv3 = fac.TypeVariable(NumberType());
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   196
        Type decl3 = fac.Class(tv3);
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   197
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   198
        TypeVar tv4 = fac.TypeVariable();
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   199
        Type decl4 = fac.Class(tv4);
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   200
        tv4.bound = decl4;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   201
        tv4.tsym.name = predef.exceptionType.tsym.name;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   202
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   203
        TypeVar tv5 = fac.TypeVariable();
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   204
        Type decl5 = fac.Class(tv5);
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   205
        tv5.bound = subst(decl5, Mapping(tv5, fac.Wildcard(BoundKind.EXTENDS, tv5)));
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   206
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   207
        TypeVar tv6 = fac.TypeVariable();
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   208
        Type decl6 = fac.Class(tv6);
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   209
        tv6.bound = subst(decl6, Mapping(tv6, fac.Wildcard(BoundKind.SUPER, tv6)));
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   210
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   211
        TypeVar tv7 = fac.TypeVariable();
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   212
        Type decl7 = fac.Class(tv7);
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   213
        tv7.bound = subst(decl7, Mapping(tv7, fac.Wildcard(BoundKind.UNBOUND, predef.objectType)));
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   214
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   215
        columns = new Type[] {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   216
            decl1, decl2, decl3, decl4, decl5, decl6, decl7
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   217
        };
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   218
    }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   219
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   220
    void test() {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   221
        for (int i = 0; i < rows.length ; i++) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   222
            for (int j = 0; j < columns.length ; j++) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   223
                Type decl = columns[j];
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   224
                Type inst = rows[i].inst(decl);
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   225
                if (isValidInstantiation[i][j] != Result.IGNORE) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   226
                    executedCount++;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   227
                    assertValidGenericType(inst, isValidInstantiation[i][j].value);
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   228
                } else {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   229
                    ignoredCount++;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   230
                }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   231
            }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   232
        }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   233
    }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   234
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   235
    Type NumberType() {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   236
        Symbol s = box(predef.intType).tsym;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   237
        s.complete();
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   238
        return ((ClassType)s.type).supertype_field;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   239
    }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   240
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   241
    @SuppressWarnings("unchecked")
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   242
    <T> T[] join(Class<T> type, T[]... args) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   243
        int totalLength = 0;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   244
        for (T[] arr : args) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   245
            totalLength += arr.length;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   246
        }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   247
        T[] new_arr = (T[])Array.newInstance(type, totalLength);
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   248
        int idx = 0;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   249
        for (T[] arr : args) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   250
            System.arraycopy(arr, 0, new_arr, idx, arr.length);
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   251
            idx += arr.length;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   252
        }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   253
        return new_arr;
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   254
    }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   255
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   256
    public static void main(String[] args) {
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   257
        new GenericTypeWellFormednessTest().test();
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   258
        System.out.println("Executed checks : " + executedCount);
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   259
        System.out.println("Ignored checks : " + ignoredCount);
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   260
    }
b3f278fe95d6 7007432: Test generic types well-formedness
mcimadamore
parents:
diff changeset
   261
}