1 /*
   2  * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 // -- This file was mechanically generated: Do not edit! -- //
  25 
  26 /*
  27  * @test
  28  * @bug 8156486 8207257
  29  * @run testng/othervm -XX:+EnableValhalla VarHandleTestMethodTypePoint
  30  * @run testng/othervm -Djava.lang.invoke.VarHandle.VAR_HANDLE_GUARDS=false
  31  *                     -XX:+EnableValhalla  VarHandleTestMethodTypePoint
  32  */
  33 
  34 import org.testng.annotations.BeforeClass;
  35 import org.testng.annotations.DataProvider;
  36 import org.testng.annotations.Test;
  37 
  38 import java.lang.invoke.MethodHandles;
  39 import java.lang.invoke.VarHandle;
  40 import java.util.ArrayList;
  41 import java.util.Arrays;
  42 import java.util.List;
  43 
  44 import static org.testng.Assert.*;
  45 
  46 import static java.lang.invoke.MethodType.*;
  47 
  48 public class VarHandleTestMethodTypePoint extends VarHandleBaseTest {
  49     static final Point static_final_v = Point.getInstance(1,1);
  50 
  51     static Point static_v = Point.getInstance(1,1);
  52 
  53     final Point final_v = Point.getInstance(1,1);
  54 
  55     Point v = Point.getInstance(1,1);
  56 
  57     VarHandle vhFinalField;
  58 
  59     VarHandle vhField;
  60 
  61     VarHandle vhStaticField;
  62 
  63     VarHandle vhStaticFinalField;
  64 
  65     VarHandle vhArray;
  66 
  67     @BeforeClass
  68     public void setup() throws Exception {
  69         vhFinalField = MethodHandles.lookup().findVarHandle(
  70                 VarHandleTestMethodTypePoint.class, "final_v", Point.class);
  71 
  72         vhField = MethodHandles.lookup().findVarHandle(
  73                 VarHandleTestMethodTypePoint.class, "v", Point.class);
  74 
  75         vhStaticFinalField = MethodHandles.lookup().findStaticVarHandle(
  76             VarHandleTestMethodTypePoint.class, "static_final_v", Point.class);
  77 
  78         vhStaticField = MethodHandles.lookup().findStaticVarHandle(
  79             VarHandleTestMethodTypePoint.class, "static_v", Point.class);
  80 
  81         vhArray = MethodHandles.arrayElementVarHandle(Point[].class);
  82     }
  83 
  84     @DataProvider
  85     public Object[][] accessTestCaseProvider() throws Exception {
  86         List<AccessTestCase<?>> cases = new ArrayList<>();
  87 
  88         cases.add(new VarHandleAccessTestCase("Instance field",
  89                                               vhField, vh -> testInstanceFieldWrongMethodType(this, vh),
  90                                               false));
  91 
  92         cases.add(new VarHandleAccessTestCase("Static field",
  93                                               vhStaticField, VarHandleTestMethodTypePoint::testStaticFieldWrongMethodType,
  94                                               false));
  95 
  96         cases.add(new VarHandleAccessTestCase("Array",
  97                                               vhArray, VarHandleTestMethodTypePoint::testArrayWrongMethodType,
  98                                               false));
  99 
 100         for (VarHandleToMethodHandle f : VarHandleToMethodHandle.values()) {
 101             cases.add(new MethodHandleAccessTestCase("Instance field",
 102                                                      vhField, f, hs -> testInstanceFieldWrongMethodType(this, hs),
 103                                                      false));
 104 
 105             cases.add(new MethodHandleAccessTestCase("Static field",
 106                                                      vhStaticField, f, VarHandleTestMethodTypePoint::testStaticFieldWrongMethodType,
 107                                                      false));
 108 
 109             cases.add(new MethodHandleAccessTestCase("Array",
 110                                                      vhArray, f, VarHandleTestMethodTypePoint::testArrayWrongMethodType,
 111                                                      false));
 112         }
 113         // Work around issue with jtreg summary reporting which truncates
 114         // the String result of Object.toString to 30 characters, hence
 115         // the first dummy argument
 116         return cases.stream().map(tc -> new Object[]{tc.toString(), tc}).toArray(Object[][]::new);
 117     }
 118 
 119     @Test(dataProvider = "accessTestCaseProvider")
 120     public <T> void testAccess(String desc, AccessTestCase<T> atc) throws Throwable {
 121         T t = atc.get();
 122         int iters = atc.requiresLoop() ? ITERS : 1;
 123         for (int c = 0; c < iters; c++) {
 124             atc.testAccess(t);
 125         }
 126     }
 127 
 128 
 129     static void testInstanceFieldWrongMethodType(VarHandleTestMethodTypePoint recv, VarHandle vh) throws Throwable {
 130         // Get
 131         // Incorrect argument types
 132         checkNPE(() -> { // null receiver
 133             Point x = (Point) vh.get(null);
 134         });
 135         checkCCE(() -> { // receiver reference class
 136             Point x = (Point) vh.get(Void.class);
 137         });
 138         checkWMTE(() -> { // receiver primitive class
 139             Point x = (Point) vh.get(0);
 140         });
 141         // Incorrect return type
 142         checkCCE(() -> { // reference class
 143             Void x = (Void) vh.get(recv);
 144         });
 145         checkWMTE(() -> { // primitive class
 146             boolean x = (boolean) vh.get(recv);
 147         });
 148         // Incorrect arity
 149         checkWMTE(() -> { // 0
 150             Point x = (Point) vh.get();
 151         });
 152         checkWMTE(() -> { // >
 153             Point x = (Point) vh.get(recv, Void.class);
 154         });
 155 
 156 
 157         // Set
 158         // Incorrect argument types
 159         checkNPE(() -> { // null receiver
 160             vh.set(null, Point.getInstance(1,1));
 161         });
 162         checkCCE(() -> { // receiver reference class
 163             vh.set(Void.class, Point.getInstance(1,1));
 164         });
 165         checkCCE(() -> { // value reference class
 166             vh.set(recv, Void.class);
 167         });
 168         checkWMTE(() -> { // receiver primitive class
 169             vh.set(0, Point.getInstance(1,1));
 170         });
 171         // Incorrect arity
 172         checkWMTE(() -> { // 0
 173             vh.set();
 174         });
 175         checkWMTE(() -> { // >
 176             vh.set(recv, Point.getInstance(1,1), Void.class);
 177         });
 178 
 179 
 180         // GetVolatile
 181         // Incorrect argument types
 182         checkNPE(() -> { // null receiver
 183             Point x = (Point) vh.getVolatile(null);
 184         });
 185         checkCCE(() -> { // receiver reference class
 186             Point x = (Point) vh.getVolatile(Void.class);
 187         });
 188         checkWMTE(() -> { // receiver primitive class
 189             Point x = (Point) vh.getVolatile(0);
 190         });
 191         // Incorrect return type
 192         checkCCE(() -> { // reference class
 193             Void x = (Void) vh.getVolatile(recv);
 194         });
 195         checkWMTE(() -> { // primitive class
 196             boolean x = (boolean) vh.getVolatile(recv);
 197         });
 198         // Incorrect arity
 199         checkWMTE(() -> { // 0
 200             Point x = (Point) vh.getVolatile();
 201         });
 202         checkWMTE(() -> { // >
 203             Point x = (Point) vh.getVolatile(recv, Void.class);
 204         });
 205 
 206 
 207         // SetVolatile
 208         // Incorrect argument types
 209         checkNPE(() -> { // null receiver
 210             vh.setVolatile(null, Point.getInstance(1,1));
 211         });
 212         checkCCE(() -> { // receiver reference class
 213             vh.setVolatile(Void.class, Point.getInstance(1,1));
 214         });
 215         checkCCE(() -> { // value reference class
 216             vh.setVolatile(recv, Void.class);
 217         });
 218         checkWMTE(() -> { // receiver primitive class
 219             vh.setVolatile(0, Point.getInstance(1,1));
 220         });
 221         // Incorrect arity
 222         checkWMTE(() -> { // 0
 223             vh.setVolatile();
 224         });
 225         checkWMTE(() -> { // >
 226             vh.setVolatile(recv, Point.getInstance(1,1), Void.class);
 227         });
 228 
 229 
 230         // GetOpaque
 231         // Incorrect argument types
 232         checkNPE(() -> { // null receiver
 233             Point x = (Point) vh.getOpaque(null);
 234         });
 235         checkCCE(() -> { // receiver reference class
 236             Point x = (Point) vh.getOpaque(Void.class);
 237         });
 238         checkWMTE(() -> { // receiver primitive class
 239             Point x = (Point) vh.getOpaque(0);
 240         });
 241         // Incorrect return type
 242         checkCCE(() -> { // reference class
 243             Void x = (Void) vh.getOpaque(recv);
 244         });
 245         checkWMTE(() -> { // primitive class
 246             boolean x = (boolean) vh.getOpaque(recv);
 247         });
 248         // Incorrect arity
 249         checkWMTE(() -> { // 0
 250             Point x = (Point) vh.getOpaque();
 251         });
 252         checkWMTE(() -> { // >
 253             Point x = (Point) vh.getOpaque(recv, Void.class);
 254         });
 255 
 256 
 257         // SetOpaque
 258         // Incorrect argument types
 259         checkNPE(() -> { // null receiver
 260             vh.setOpaque(null, Point.getInstance(1,1));
 261         });
 262         checkCCE(() -> { // receiver reference class
 263             vh.setOpaque(Void.class, Point.getInstance(1,1));
 264         });
 265         checkCCE(() -> { // value reference class
 266             vh.setOpaque(recv, Void.class);
 267         });
 268         checkWMTE(() -> { // receiver primitive class
 269             vh.setOpaque(0, Point.getInstance(1,1));
 270         });
 271         // Incorrect arity
 272         checkWMTE(() -> { // 0
 273             vh.setOpaque();
 274         });
 275         checkWMTE(() -> { // >
 276             vh.setOpaque(recv, Point.getInstance(1,1), Void.class);
 277         });
 278 
 279 
 280         // GetAcquire
 281         // Incorrect argument types
 282         checkNPE(() -> { // null receiver
 283             Point x = (Point) vh.getAcquire(null);
 284         });
 285         checkCCE(() -> { // receiver reference class
 286             Point x = (Point) vh.getAcquire(Void.class);
 287         });
 288         checkWMTE(() -> { // receiver primitive class
 289             Point x = (Point) vh.getAcquire(0);
 290         });
 291         // Incorrect return type
 292         checkCCE(() -> { // reference class
 293             Void x = (Void) vh.getAcquire(recv);
 294         });
 295         checkWMTE(() -> { // primitive class
 296             boolean x = (boolean) vh.getAcquire(recv);
 297         });
 298         // Incorrect arity
 299         checkWMTE(() -> { // 0
 300             Point x = (Point) vh.getAcquire();
 301         });
 302         checkWMTE(() -> { // >
 303             Point x = (Point) vh.getAcquire(recv, Void.class);
 304         });
 305 
 306 
 307         // SetRelease
 308         // Incorrect argument types
 309         checkNPE(() -> { // null receiver
 310             vh.setRelease(null, Point.getInstance(1,1));
 311         });
 312         checkCCE(() -> { // receiver reference class
 313             vh.setRelease(Void.class, Point.getInstance(1,1));
 314         });
 315         checkCCE(() -> { // value reference class
 316             vh.setRelease(recv, Void.class);
 317         });
 318         checkWMTE(() -> { // receiver primitive class
 319             vh.setRelease(0, Point.getInstance(1,1));
 320         });
 321         // Incorrect arity
 322         checkWMTE(() -> { // 0
 323             vh.setRelease();
 324         });
 325         checkWMTE(() -> { // >
 326             vh.setRelease(recv, Point.getInstance(1,1), Void.class);
 327         });
 328 
 329 
 330         // CompareAndSet
 331         // Incorrect argument types
 332         checkNPE(() -> { // null receiver
 333             boolean r = vh.compareAndSet(null, Point.getInstance(1,1), Point.getInstance(1,1));
 334         });
 335         checkCCE(() -> { // receiver reference class
 336             boolean r = vh.compareAndSet(Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
 337         });
 338         checkCCE(() -> { // expected reference class
 339             boolean r = vh.compareAndSet(recv, Void.class, Point.getInstance(1,1));
 340         });
 341         checkCCE(() -> { // actual reference class
 342             boolean r = vh.compareAndSet(recv, Point.getInstance(1,1), Void.class);
 343         });
 344         checkWMTE(() -> { // receiver primitive class
 345             boolean r = vh.compareAndSet(0, Point.getInstance(1,1), Point.getInstance(1,1));
 346         });
 347         // Incorrect arity
 348         checkWMTE(() -> { // 0
 349             boolean r = vh.compareAndSet();
 350         });
 351         checkWMTE(() -> { // >
 352             boolean r = vh.compareAndSet(recv, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
 353         });
 354 
 355 
 356         // WeakCompareAndSet
 357         // Incorrect argument types
 358         checkNPE(() -> { // null receiver
 359             boolean r = vh.weakCompareAndSetPlain(null, Point.getInstance(1,1), Point.getInstance(1,1));
 360         });
 361         checkCCE(() -> { // receiver reference class
 362             boolean r = vh.weakCompareAndSetPlain(Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
 363         });
 364         checkCCE(() -> { // expected reference class
 365             boolean r = vh.weakCompareAndSetPlain(recv, Void.class, Point.getInstance(1,1));
 366         });
 367         checkCCE(() -> { // actual reference class
 368             boolean r = vh.weakCompareAndSetPlain(recv, Point.getInstance(1,1), Void.class);
 369         });
 370         checkWMTE(() -> { // receiver primitive class
 371             boolean r = vh.weakCompareAndSetPlain(0, Point.getInstance(1,1), Point.getInstance(1,1));
 372         });
 373         // Incorrect arity
 374         checkWMTE(() -> { // 0
 375             boolean r = vh.weakCompareAndSetPlain();
 376         });
 377         checkWMTE(() -> { // >
 378             boolean r = vh.weakCompareAndSetPlain(recv, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
 379         });
 380 
 381 
 382         // WeakCompareAndSetVolatile
 383         // Incorrect argument types
 384         checkNPE(() -> { // null receiver
 385             boolean r = vh.weakCompareAndSet(null, Point.getInstance(1,1), Point.getInstance(1,1));
 386         });
 387         checkCCE(() -> { // receiver reference class
 388             boolean r = vh.weakCompareAndSet(Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
 389         });
 390         checkCCE(() -> { // expected reference class
 391             boolean r = vh.weakCompareAndSet(recv, Void.class, Point.getInstance(1,1));
 392         });
 393         checkCCE(() -> { // actual reference class
 394             boolean r = vh.weakCompareAndSet(recv, Point.getInstance(1,1), Void.class);
 395         });
 396         checkWMTE(() -> { // receiver primitive class
 397             boolean r = vh.weakCompareAndSet(0, Point.getInstance(1,1), Point.getInstance(1,1));
 398         });
 399         // Incorrect arity
 400         checkWMTE(() -> { // 0
 401             boolean r = vh.weakCompareAndSet();
 402         });
 403         checkWMTE(() -> { // >
 404             boolean r = vh.weakCompareAndSet(recv, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
 405         });
 406 
 407 
 408         // WeakCompareAndSetAcquire
 409         // Incorrect argument types
 410         checkNPE(() -> { // null receiver
 411             boolean r = vh.weakCompareAndSetAcquire(null, Point.getInstance(1,1), Point.getInstance(1,1));
 412         });
 413         checkCCE(() -> { // receiver reference class
 414             boolean r = vh.weakCompareAndSetAcquire(Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
 415         });
 416         checkCCE(() -> { // expected reference class
 417             boolean r = vh.weakCompareAndSetAcquire(recv, Void.class, Point.getInstance(1,1));
 418         });
 419         checkCCE(() -> { // actual reference class
 420             boolean r = vh.weakCompareAndSetAcquire(recv, Point.getInstance(1,1), Void.class);
 421         });
 422         checkWMTE(() -> { // receiver primitive class
 423             boolean r = vh.weakCompareAndSetAcquire(0, Point.getInstance(1,1), Point.getInstance(1,1));
 424         });
 425         // Incorrect arity
 426         checkWMTE(() -> { // 0
 427             boolean r = vh.weakCompareAndSetAcquire();
 428         });
 429         checkWMTE(() -> { // >
 430             boolean r = vh.weakCompareAndSetAcquire(recv, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
 431         });
 432 
 433 
 434         // WeakCompareAndSetRelease
 435         // Incorrect argument types
 436         checkNPE(() -> { // null receiver
 437             boolean r = vh.weakCompareAndSetRelease(null, Point.getInstance(1,1), Point.getInstance(1,1));
 438         });
 439         checkCCE(() -> { // receiver reference class
 440             boolean r = vh.weakCompareAndSetRelease(Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
 441         });
 442         checkCCE(() -> { // expected reference class
 443             boolean r = vh.weakCompareAndSetRelease(recv, Void.class, Point.getInstance(1,1));
 444         });
 445         checkCCE(() -> { // actual reference class
 446             boolean r = vh.weakCompareAndSetRelease(recv, Point.getInstance(1,1), Void.class);
 447         });
 448         checkWMTE(() -> { // receiver primitive class
 449             boolean r = vh.weakCompareAndSetRelease(0, Point.getInstance(1,1), Point.getInstance(1,1));
 450         });
 451         // Incorrect arity
 452         checkWMTE(() -> { // 0
 453             boolean r = vh.weakCompareAndSetRelease();
 454         });
 455         checkWMTE(() -> { // >
 456             boolean r = vh.weakCompareAndSetRelease(recv, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
 457         });
 458 
 459 
 460         // CompareAndExchange
 461         // Incorrect argument types
 462         checkNPE(() -> { // null receiver
 463             Point x = (Point) vh.compareAndExchange(null, Point.getInstance(1,1), Point.getInstance(1,1));
 464         });
 465         checkCCE(() -> { // receiver reference class
 466             Point x = (Point) vh.compareAndExchange(Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
 467         });
 468         checkCCE(() -> { // expected reference class
 469             Point x = (Point) vh.compareAndExchange(recv, Void.class, Point.getInstance(1,1));
 470         });
 471         checkCCE(() -> { // actual reference class
 472             Point x = (Point) vh.compareAndExchange(recv, Point.getInstance(1,1), Void.class);
 473         });
 474         checkWMTE(() -> { // reciever primitive class
 475             Point x = (Point) vh.compareAndExchange(0, Point.getInstance(1,1), Point.getInstance(1,1));
 476         });
 477         // Incorrect return type
 478         checkCCE(() -> { // reference class
 479             Void r = (Void) vh.compareAndExchange(recv, Point.getInstance(1,1), Point.getInstance(1,1));
 480         });
 481         checkWMTE(() -> { // primitive class
 482             boolean x = (boolean) vh.compareAndExchange(recv, Point.getInstance(1,1), Point.getInstance(1,1));
 483         });
 484         // Incorrect arity
 485         checkWMTE(() -> { // 0
 486             Point x = (Point) vh.compareAndExchange();
 487         });
 488         checkWMTE(() -> { // >
 489             Point x = (Point) vh.compareAndExchange(recv, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
 490         });
 491 
 492 
 493         // CompareAndExchangeAcquire
 494         // Incorrect argument types
 495         checkNPE(() -> { // null receiver
 496             Point x = (Point) vh.compareAndExchangeAcquire(null, Point.getInstance(1,1), Point.getInstance(1,1));
 497         });
 498         checkCCE(() -> { // receiver reference class
 499             Point x = (Point) vh.compareAndExchangeAcquire(Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
 500         });
 501         checkCCE(() -> { // expected reference class
 502             Point x = (Point) vh.compareAndExchangeAcquire(recv, Void.class, Point.getInstance(1,1));
 503         });
 504         checkCCE(() -> { // actual reference class
 505             Point x = (Point) vh.compareAndExchangeAcquire(recv, Point.getInstance(1,1), Void.class);
 506         });
 507         checkWMTE(() -> { // reciever primitive class
 508             Point x = (Point) vh.compareAndExchangeAcquire(0, Point.getInstance(1,1), Point.getInstance(1,1));
 509         });
 510         // Incorrect return type
 511         checkCCE(() -> { // reference class
 512             Void r = (Void) vh.compareAndExchangeAcquire(recv, Point.getInstance(1,1), Point.getInstance(1,1));
 513         });
 514         checkWMTE(() -> { // primitive class
 515             boolean x = (boolean) vh.compareAndExchangeAcquire(recv, Point.getInstance(1,1), Point.getInstance(1,1));
 516         });
 517         // Incorrect arity
 518         checkWMTE(() -> { // 0
 519             Point x = (Point) vh.compareAndExchangeAcquire();
 520         });
 521         checkWMTE(() -> { // >
 522             Point x = (Point) vh.compareAndExchangeAcquire(recv, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
 523         });
 524 
 525 
 526         // CompareAndExchangeRelease
 527         // Incorrect argument types
 528         checkNPE(() -> { // null receiver
 529             Point x = (Point) vh.compareAndExchangeRelease(null, Point.getInstance(1,1), Point.getInstance(1,1));
 530         });
 531         checkCCE(() -> { // receiver reference class
 532             Point x = (Point) vh.compareAndExchangeRelease(Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
 533         });
 534         checkCCE(() -> { // expected reference class
 535             Point x = (Point) vh.compareAndExchangeRelease(recv, Void.class, Point.getInstance(1,1));
 536         });
 537         checkCCE(() -> { // actual reference class
 538             Point x = (Point) vh.compareAndExchangeRelease(recv, Point.getInstance(1,1), Void.class);
 539         });
 540         checkWMTE(() -> { // reciever primitive class
 541             Point x = (Point) vh.compareAndExchangeRelease(0, Point.getInstance(1,1), Point.getInstance(1,1));
 542         });
 543         // Incorrect return type
 544         checkCCE(() -> { // reference class
 545             Void r = (Void) vh.compareAndExchangeRelease(recv, Point.getInstance(1,1), Point.getInstance(1,1));
 546         });
 547         checkWMTE(() -> { // primitive class
 548             boolean x = (boolean) vh.compareAndExchangeRelease(recv, Point.getInstance(1,1), Point.getInstance(1,1));
 549         });
 550         // Incorrect arity
 551         checkWMTE(() -> { // 0
 552             Point x = (Point) vh.compareAndExchangeRelease();
 553         });
 554         checkWMTE(() -> { // >
 555             Point x = (Point) vh.compareAndExchangeRelease(recv, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
 556         });
 557 
 558 
 559         // GetAndSet
 560         // Incorrect argument types
 561         checkNPE(() -> { // null receiver
 562             Point x = (Point) vh.getAndSet(null, Point.getInstance(1,1));
 563         });
 564         checkCCE(() -> { // receiver reference class
 565             Point x = (Point) vh.getAndSet(Void.class, Point.getInstance(1,1));
 566         });
 567         checkCCE(() -> { // value reference class
 568             Point x = (Point) vh.getAndSet(recv, Void.class);
 569         });
 570         checkWMTE(() -> { // reciever primitive class
 571             Point x = (Point) vh.getAndSet(0, Point.getInstance(1,1));
 572         });
 573         // Incorrect return type
 574         checkCCE(() -> { // reference class
 575             Void r = (Void) vh.getAndSet(recv, Point.getInstance(1,1));
 576         });
 577         checkWMTE(() -> { // primitive class
 578             boolean x = (boolean) vh.getAndSet(recv, Point.getInstance(1,1));
 579         });
 580         // Incorrect arity
 581         checkWMTE(() -> { // 0
 582             Point x = (Point) vh.getAndSet();
 583         });
 584         checkWMTE(() -> { // >
 585             Point x = (Point) vh.getAndSet(recv, Point.getInstance(1,1), Void.class);
 586         });
 587 
 588         // GetAndSetAcquire
 589         // Incorrect argument types
 590         checkNPE(() -> { // null receiver
 591             Point x = (Point) vh.getAndSetAcquire(null, Point.getInstance(1,1));
 592         });
 593         checkCCE(() -> { // receiver reference class
 594             Point x = (Point) vh.getAndSetAcquire(Void.class, Point.getInstance(1,1));
 595         });
 596         checkCCE(() -> { // value reference class
 597             Point x = (Point) vh.getAndSetAcquire(recv, Void.class);
 598         });
 599         checkWMTE(() -> { // reciever primitive class
 600             Point x = (Point) vh.getAndSetAcquire(0, Point.getInstance(1,1));
 601         });
 602         // Incorrect return type
 603         checkCCE(() -> { // reference class
 604             Void r = (Void) vh.getAndSetAcquire(recv, Point.getInstance(1,1));
 605         });
 606         checkWMTE(() -> { // primitive class
 607             boolean x = (boolean) vh.getAndSetAcquire(recv, Point.getInstance(1,1));
 608         });
 609         // Incorrect arity
 610         checkWMTE(() -> { // 0
 611             Point x = (Point) vh.getAndSetAcquire();
 612         });
 613         checkWMTE(() -> { // >
 614             Point x = (Point) vh.getAndSetAcquire(recv, Point.getInstance(1,1), Void.class);
 615         });
 616 
 617         // GetAndSetRelease
 618         // Incorrect argument types
 619         checkNPE(() -> { // null receiver
 620             Point x = (Point) vh.getAndSetRelease(null, Point.getInstance(1,1));
 621         });
 622         checkCCE(() -> { // receiver reference class
 623             Point x = (Point) vh.getAndSetRelease(Void.class, Point.getInstance(1,1));
 624         });
 625         checkCCE(() -> { // value reference class
 626             Point x = (Point) vh.getAndSetRelease(recv, Void.class);
 627         });
 628         checkWMTE(() -> { // reciever primitive class
 629             Point x = (Point) vh.getAndSetRelease(0, Point.getInstance(1,1));
 630         });
 631         // Incorrect return type
 632         checkCCE(() -> { // reference class
 633             Void r = (Void) vh.getAndSetRelease(recv, Point.getInstance(1,1));
 634         });
 635         checkWMTE(() -> { // primitive class
 636             boolean x = (boolean) vh.getAndSetRelease(recv, Point.getInstance(1,1));
 637         });
 638         // Incorrect arity
 639         checkWMTE(() -> { // 0
 640             Point x = (Point) vh.getAndSetRelease();
 641         });
 642         checkWMTE(() -> { // >
 643             Point x = (Point) vh.getAndSetRelease(recv, Point.getInstance(1,1), Void.class);
 644         });
 645 
 646 
 647     }
 648 
 649     static void testInstanceFieldWrongMethodType(VarHandleTestMethodTypePoint recv, Handles hs) throws Throwable {
 650         for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) {
 651             // Incorrect argument types
 652             checkNPE(() -> { // null receiver
 653                 Point x = (Point) hs.get(am, methodType(Point.class, VarHandleTestMethodTypePoint.class)).
 654                     invokeExact((VarHandleTestMethodTypePoint) null);
 655             });
 656             hs.checkWMTEOrCCE(() -> { // receiver reference class
 657                 Point x = (Point) hs.get(am, methodType(Point.class, Class.class)).
 658                     invokeExact(Void.class);
 659             });
 660             checkWMTE(() -> { // receiver primitive class
 661                 Point x = (Point) hs.get(am, methodType(Point.class, int.class)).
 662                     invokeExact(0);
 663             });
 664             // Incorrect return type
 665             hs.checkWMTEOrCCE(() -> { // reference class
 666                 Void x = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypePoint.class)).
 667                     invokeExact(recv);
 668             });
 669             checkWMTE(() -> { // primitive class
 670                 boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypePoint.class)).
 671                     invokeExact(recv);
 672             });
 673             // Incorrect arity
 674             checkWMTE(() -> { // 0
 675                 Point x = (Point) hs.get(am, methodType(Point.class)).
 676                     invokeExact();
 677             });
 678             checkWMTE(() -> { // >
 679                 Point x = (Point) hs.get(am, methodType(Point.class, VarHandleTestMethodTypePoint.class, Class.class)).
 680                     invokeExact(recv, Void.class);
 681             });
 682         }
 683 
 684         for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) {
 685             // Incorrect argument types
 686             checkNPE(() -> { // null receiver
 687                 hs.get(am, methodType(void.class, VarHandleTestMethodTypePoint.class, Point.class)).
 688                     invokeExact((VarHandleTestMethodTypePoint) null, Point.getInstance(1,1));
 689             });
 690             hs.checkWMTEOrCCE(() -> { // receiver reference class
 691                 hs.get(am, methodType(void.class, Class.class, Point.class)).
 692                     invokeExact(Void.class, Point.getInstance(1,1));
 693             });
 694             hs.checkWMTEOrCCE(() -> { // value reference class
 695                 hs.get(am, methodType(void.class, VarHandleTestMethodTypePoint.class, Class.class)).
 696                     invokeExact(recv, Void.class);
 697             });
 698             checkWMTE(() -> { // receiver primitive class
 699                 hs.get(am, methodType(void.class, int.class, Point.class)).
 700                     invokeExact(0, Point.getInstance(1,1));
 701             });
 702             // Incorrect arity
 703             checkWMTE(() -> { // 0
 704                 hs.get(am, methodType(void.class)).
 705                     invokeExact();
 706             });
 707             checkWMTE(() -> { // >
 708                 hs.get(am, methodType(void.class, VarHandleTestMethodTypePoint.class, Point.class, Class.class)).
 709                     invokeExact(recv, Point.getInstance(1,1), Void.class);
 710             });
 711         }
 712 
 713         for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) {
 714             // Incorrect argument types
 715             checkNPE(() -> { // null receiver
 716                 boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypePoint.class, Point.class, Point.class)).
 717                     invokeExact((VarHandleTestMethodTypePoint) null, Point.getInstance(1,1), Point.getInstance(1,1));
 718             });
 719             hs.checkWMTEOrCCE(() -> { // receiver reference class
 720                 boolean r = (boolean) hs.get(am, methodType(boolean.class, Class.class, Point.class, Point.class)).
 721                     invokeExact(Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
 722             });
 723             hs.checkWMTEOrCCE(() -> { // expected reference class
 724                 boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypePoint.class, Class.class, Point.class)).
 725                     invokeExact(recv, Void.class, Point.getInstance(1,1));
 726             });
 727             hs.checkWMTEOrCCE(() -> { // actual reference class
 728                 boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypePoint.class, Point.class, Class.class)).
 729                     invokeExact(recv, Point.getInstance(1,1), Void.class);
 730             });
 731             checkWMTE(() -> { // receiver primitive class
 732                 boolean r = (boolean) hs.get(am, methodType(boolean.class, int.class , Point.class, Point.class)).
 733                     invokeExact(0, Point.getInstance(1,1), Point.getInstance(1,1));
 734             });
 735             // Incorrect arity
 736             checkWMTE(() -> { // 0
 737                 boolean r = (boolean) hs.get(am, methodType(boolean.class)).
 738                     invokeExact();
 739             });
 740             checkWMTE(() -> { // >
 741                 boolean r = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypePoint.class, Point.class, Point.class, Class.class)).
 742                     invokeExact(recv, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
 743             });
 744         }
 745 
 746         for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
 747             checkNPE(() -> { // null receiver
 748                 Point x = (Point) hs.get(am, methodType(Point.class, VarHandleTestMethodTypePoint.class, Point.class, Point.class)).
 749                     invokeExact((VarHandleTestMethodTypePoint) null, Point.getInstance(1,1), Point.getInstance(1,1));
 750             });
 751             hs.checkWMTEOrCCE(() -> { // receiver reference class
 752                 Point x = (Point) hs.get(am, methodType(Point.class, Class.class, Point.class, Point.class)).
 753                     invokeExact(Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
 754             });
 755             hs.checkWMTEOrCCE(() -> { // expected reference class
 756                 Point x = (Point) hs.get(am, methodType(Point.class, VarHandleTestMethodTypePoint.class, Class.class, Point.class)).
 757                     invokeExact(recv, Void.class, Point.getInstance(1,1));
 758             });
 759             hs.checkWMTEOrCCE(() -> { // actual reference class
 760                 Point x = (Point) hs.get(am, methodType(Point.class, VarHandleTestMethodTypePoint.class, Point.class, Class.class)).
 761                     invokeExact(recv, Point.getInstance(1,1), Void.class);
 762             });
 763             checkWMTE(() -> { // reciever primitive class
 764                 Point x = (Point) hs.get(am, methodType(Point.class, int.class , Point.class, Point.class)).
 765                     invokeExact(0, Point.getInstance(1,1), Point.getInstance(1,1));
 766             });
 767             // Incorrect return type
 768             hs.checkWMTEOrCCE(() -> { // reference class
 769                 Void r = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypePoint.class , Point.class, Point.class)).
 770                     invokeExact(recv, Point.getInstance(1,1), Point.getInstance(1,1));
 771             });
 772             checkWMTE(() -> { // primitive class
 773                 boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypePoint.class , Point.class, Point.class)).
 774                     invokeExact(recv, Point.getInstance(1,1), Point.getInstance(1,1));
 775             });
 776             // Incorrect arity
 777             checkWMTE(() -> { // 0
 778                 Point x = (Point) hs.get(am, methodType(Point.class)).
 779                     invokeExact();
 780             });
 781             checkWMTE(() -> { // >
 782                 Point x = (Point) hs.get(am, methodType(Point.class, VarHandleTestMethodTypePoint.class, Point.class, Point.class, Class.class)).
 783                     invokeExact(recv, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
 784             });
 785         }
 786 
 787         for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
 788             checkNPE(() -> { // null receiver
 789                 Point x = (Point) hs.get(am, methodType(Point.class, VarHandleTestMethodTypePoint.class, Point.class)).
 790                     invokeExact((VarHandleTestMethodTypePoint) null, Point.getInstance(1,1));
 791             });
 792             hs.checkWMTEOrCCE(() -> { // receiver reference class
 793                 Point x = (Point) hs.get(am, methodType(Point.class, Class.class, Point.class)).
 794                     invokeExact(Void.class, Point.getInstance(1,1));
 795             });
 796             hs.checkWMTEOrCCE(() -> { // value reference class
 797                 Point x = (Point) hs.get(am, methodType(Point.class, VarHandleTestMethodTypePoint.class, Class.class)).
 798                     invokeExact(recv, Void.class);
 799             });
 800             checkWMTE(() -> { // reciever primitive class
 801                 Point x = (Point) hs.get(am, methodType(Point.class, int.class, Point.class)).
 802                     invokeExact(0, Point.getInstance(1,1));
 803             });
 804             // Incorrect return type
 805             hs.checkWMTEOrCCE(() -> { // reference class
 806                 Void r = (Void) hs.get(am, methodType(Void.class, VarHandleTestMethodTypePoint.class, Point.class)).
 807                     invokeExact(recv, Point.getInstance(1,1));
 808             });
 809             checkWMTE(() -> { // primitive class
 810                 boolean x = (boolean) hs.get(am, methodType(boolean.class, VarHandleTestMethodTypePoint.class, Point.class)).
 811                     invokeExact(recv, Point.getInstance(1,1));
 812             });
 813             // Incorrect arity
 814             checkWMTE(() -> { // 0
 815                 Point x = (Point) hs.get(am, methodType(Point.class)).
 816                     invokeExact();
 817             });
 818             checkWMTE(() -> { // >
 819                 Point x = (Point) hs.get(am, methodType(Point.class, VarHandleTestMethodTypePoint.class, Point.class)).
 820                     invokeExact(recv, Point.getInstance(1,1), Void.class);
 821             });
 822         }
 823 
 824 
 825     }
 826 
 827 
 828     static void testStaticFieldWrongMethodType(VarHandle vh) throws Throwable {
 829         // Get
 830         // Incorrect return type
 831         checkCCE(() -> { // reference class
 832             Void x = (Void) vh.get();
 833         });
 834         checkWMTE(() -> { // primitive class
 835             boolean x = (boolean) vh.get();
 836         });
 837         // Incorrect arity
 838         checkWMTE(() -> { // >
 839             Point x = (Point) vh.get(Void.class);
 840         });
 841 
 842 
 843         // Set
 844         // Incorrect argument types
 845         checkCCE(() -> { // value reference class
 846             vh.set(Void.class);
 847         });
 848         // Incorrect arity
 849         checkWMTE(() -> { // 0
 850             vh.set();
 851         });
 852         checkWMTE(() -> { // >
 853             vh.set(Point.getInstance(1,1), Void.class);
 854         });
 855 
 856 
 857         // GetVolatile
 858         // Incorrect return type
 859         checkCCE(() -> { // reference class
 860             Void x = (Void) vh.getVolatile();
 861         });
 862         checkWMTE(() -> { // primitive class
 863             boolean x = (boolean) vh.getVolatile();
 864         });
 865         checkWMTE(() -> { // >
 866             Point x = (Point) vh.getVolatile(Void.class);
 867         });
 868 
 869 
 870         // SetVolatile
 871         // Incorrect argument types
 872         checkCCE(() -> { // value reference class
 873             vh.setVolatile(Void.class);
 874         });
 875         // Incorrect arity
 876         checkWMTE(() -> { // 0
 877             vh.setVolatile();
 878         });
 879         checkWMTE(() -> { // >
 880             vh.setVolatile(Point.getInstance(1,1), Void.class);
 881         });
 882 
 883 
 884         // GetOpaque
 885         // Incorrect return type
 886         checkCCE(() -> { // reference class
 887             Void x = (Void) vh.getOpaque();
 888         });
 889         checkWMTE(() -> { // primitive class
 890             boolean x = (boolean) vh.getOpaque();
 891         });
 892         checkWMTE(() -> { // >
 893             Point x = (Point) vh.getOpaque(Void.class);
 894         });
 895 
 896 
 897         // SetOpaque
 898         // Incorrect argument types
 899         checkCCE(() -> { // value reference class
 900             vh.setOpaque(Void.class);
 901         });
 902         // Incorrect arity
 903         checkWMTE(() -> { // 0
 904             vh.setOpaque();
 905         });
 906         checkWMTE(() -> { // >
 907             vh.setOpaque(Point.getInstance(1,1), Void.class);
 908         });
 909 
 910 
 911         // GetAcquire
 912         // Incorrect return type
 913         checkCCE(() -> { // reference class
 914             Void x = (Void) vh.getAcquire();
 915         });
 916         checkWMTE(() -> { // primitive class
 917             boolean x = (boolean) vh.getAcquire();
 918         });
 919         checkWMTE(() -> { // >
 920             Point x = (Point) vh.getAcquire(Void.class);
 921         });
 922 
 923 
 924         // SetRelease
 925         // Incorrect argument types
 926         checkCCE(() -> { // value reference class
 927             vh.setRelease(Void.class);
 928         });
 929         // Incorrect arity
 930         checkWMTE(() -> { // 0
 931             vh.setRelease();
 932         });
 933         checkWMTE(() -> { // >
 934             vh.setRelease(Point.getInstance(1,1), Void.class);
 935         });
 936 
 937 
 938         // CompareAndSet
 939         // Incorrect argument types
 940         checkCCE(() -> { // expected reference class
 941             boolean r = vh.compareAndSet(Void.class, Point.getInstance(1,1));
 942         });
 943         checkCCE(() -> { // actual reference class
 944             boolean r = vh.compareAndSet(Point.getInstance(1,1), Void.class);
 945         });
 946         // Incorrect arity
 947         checkWMTE(() -> { // 0
 948             boolean r = vh.compareAndSet();
 949         });
 950         checkWMTE(() -> { // >
 951             boolean r = vh.compareAndSet(Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
 952         });
 953 
 954 
 955         // WeakCompareAndSet
 956         // Incorrect argument types
 957         checkCCE(() -> { // expected reference class
 958             boolean r = vh.weakCompareAndSetPlain(Void.class, Point.getInstance(1,1));
 959         });
 960         checkCCE(() -> { // actual reference class
 961             boolean r = vh.weakCompareAndSetPlain(Point.getInstance(1,1), Void.class);
 962         });
 963         // Incorrect arity
 964         checkWMTE(() -> { // 0
 965             boolean r = vh.weakCompareAndSetPlain();
 966         });
 967         checkWMTE(() -> { // >
 968             boolean r = vh.weakCompareAndSetPlain(Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
 969         });
 970 
 971 
 972         // WeakCompareAndSetVolatile
 973         // Incorrect argument types
 974         checkCCE(() -> { // expected reference class
 975             boolean r = vh.weakCompareAndSet(Void.class, Point.getInstance(1,1));
 976         });
 977         checkCCE(() -> { // actual reference class
 978             boolean r = vh.weakCompareAndSet(Point.getInstance(1,1), Void.class);
 979         });
 980         // Incorrect arity
 981         checkWMTE(() -> { // 0
 982             boolean r = vh.weakCompareAndSet();
 983         });
 984         checkWMTE(() -> { // >
 985             boolean r = vh.weakCompareAndSet(Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
 986         });
 987 
 988 
 989         // WeakCompareAndSetAcquire
 990         // Incorrect argument types
 991         checkCCE(() -> { // expected reference class
 992             boolean r = vh.weakCompareAndSetAcquire(Void.class, Point.getInstance(1,1));
 993         });
 994         checkCCE(() -> { // actual reference class
 995             boolean r = vh.weakCompareAndSetAcquire(Point.getInstance(1,1), Void.class);
 996         });
 997         // Incorrect arity
 998         checkWMTE(() -> { // 0
 999             boolean r = vh.weakCompareAndSetAcquire();
1000         });
1001         checkWMTE(() -> { // >
1002             boolean r = vh.weakCompareAndSetAcquire(Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
1003         });
1004 
1005 
1006         // WeakCompareAndSetRelease
1007         // Incorrect argument types
1008         checkCCE(() -> { // expected reference class
1009             boolean r = vh.weakCompareAndSetRelease(Void.class, Point.getInstance(1,1));
1010         });
1011         checkCCE(() -> { // actual reference class
1012             boolean r = vh.weakCompareAndSetRelease(Point.getInstance(1,1), Void.class);
1013         });
1014         // Incorrect arity
1015         checkWMTE(() -> { // 0
1016             boolean r = vh.weakCompareAndSetRelease();
1017         });
1018         checkWMTE(() -> { // >
1019             boolean r = vh.weakCompareAndSetRelease(Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
1020         });
1021 
1022 
1023         // CompareAndExchange
1024         // Incorrect argument types
1025         checkCCE(() -> { // expected reference class
1026             Point x = (Point) vh.compareAndExchange(Void.class, Point.getInstance(1,1));
1027         });
1028         checkCCE(() -> { // actual reference class
1029             Point x = (Point) vh.compareAndExchange(Point.getInstance(1,1), Void.class);
1030         });
1031         // Incorrect return type
1032         checkCCE(() -> { // reference class
1033             Void r = (Void) vh.compareAndExchange(Point.getInstance(1,1), Point.getInstance(1,1));
1034         });
1035         checkWMTE(() -> { // primitive class
1036             boolean x = (boolean) vh.compareAndExchange(Point.getInstance(1,1), Point.getInstance(1,1));
1037         });
1038         // Incorrect arity
1039         checkWMTE(() -> { // 0
1040             Point x = (Point) vh.compareAndExchange();
1041         });
1042         checkWMTE(() -> { // >
1043             Point x = (Point) vh.compareAndExchange(Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
1044         });
1045 
1046 
1047         // CompareAndExchangeAcquire
1048         // Incorrect argument types
1049         checkCCE(() -> { // expected reference class
1050             Point x = (Point) vh.compareAndExchangeAcquire(Void.class, Point.getInstance(1,1));
1051         });
1052         checkCCE(() -> { // actual reference class
1053             Point x = (Point) vh.compareAndExchangeAcquire(Point.getInstance(1,1), Void.class);
1054         });
1055         // Incorrect return type
1056         checkCCE(() -> { // reference class
1057             Void r = (Void) vh.compareAndExchangeAcquire(Point.getInstance(1,1), Point.getInstance(1,1));
1058         });
1059         checkWMTE(() -> { // primitive class
1060             boolean x = (boolean) vh.compareAndExchangeAcquire(Point.getInstance(1,1), Point.getInstance(1,1));
1061         });
1062         // Incorrect arity
1063         checkWMTE(() -> { // 0
1064             Point x = (Point) vh.compareAndExchangeAcquire();
1065         });
1066         checkWMTE(() -> { // >
1067             Point x = (Point) vh.compareAndExchangeAcquire(Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
1068         });
1069 
1070 
1071         // CompareAndExchangeRelease
1072         // Incorrect argument types
1073         checkCCE(() -> { // expected reference class
1074             Point x = (Point) vh.compareAndExchangeRelease(Void.class, Point.getInstance(1,1));
1075         });
1076         checkCCE(() -> { // actual reference class
1077             Point x = (Point) vh.compareAndExchangeRelease(Point.getInstance(1,1), Void.class);
1078         });
1079         // Incorrect return type
1080         checkCCE(() -> { // reference class
1081             Void r = (Void) vh.compareAndExchangeRelease(Point.getInstance(1,1), Point.getInstance(1,1));
1082         });
1083         checkWMTE(() -> { // primitive class
1084             boolean x = (boolean) vh.compareAndExchangeRelease(Point.getInstance(1,1), Point.getInstance(1,1));
1085         });
1086         // Incorrect arity
1087         checkWMTE(() -> { // 0
1088             Point x = (Point) vh.compareAndExchangeRelease();
1089         });
1090         checkWMTE(() -> { // >
1091             Point x = (Point) vh.compareAndExchangeRelease(Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
1092         });
1093 
1094 
1095         // GetAndSet
1096         // Incorrect argument types
1097         checkCCE(() -> { // value reference class
1098             Point x = (Point) vh.getAndSet(Void.class);
1099         });
1100         // Incorrect return type
1101         checkCCE(() -> { // reference class
1102             Void r = (Void) vh.getAndSet(Point.getInstance(1,1));
1103         });
1104         checkWMTE(() -> { // primitive class
1105             boolean x = (boolean) vh.getAndSet(Point.getInstance(1,1));
1106         });
1107         // Incorrect arity
1108         checkWMTE(() -> { // 0
1109             Point x = (Point) vh.getAndSet();
1110         });
1111         checkWMTE(() -> { // >
1112             Point x = (Point) vh.getAndSet(Point.getInstance(1,1), Void.class);
1113         });
1114 
1115 
1116         // GetAndSetAcquire
1117         // Incorrect argument types
1118         checkCCE(() -> { // value reference class
1119             Point x = (Point) vh.getAndSetAcquire(Void.class);
1120         });
1121         // Incorrect return type
1122         checkCCE(() -> { // reference class
1123             Void r = (Void) vh.getAndSetAcquire(Point.getInstance(1,1));
1124         });
1125         checkWMTE(() -> { // primitive class
1126             boolean x = (boolean) vh.getAndSetAcquire(Point.getInstance(1,1));
1127         });
1128         // Incorrect arity
1129         checkWMTE(() -> { // 0
1130             Point x = (Point) vh.getAndSetAcquire();
1131         });
1132         checkWMTE(() -> { // >
1133             Point x = (Point) vh.getAndSetAcquire(Point.getInstance(1,1), Void.class);
1134         });
1135 
1136 
1137         // GetAndSetRelease
1138         // Incorrect argument types
1139         checkCCE(() -> { // value reference class
1140             Point x = (Point) vh.getAndSetRelease(Void.class);
1141         });
1142         // Incorrect return type
1143         checkCCE(() -> { // reference class
1144             Void r = (Void) vh.getAndSetRelease(Point.getInstance(1,1));
1145         });
1146         checkWMTE(() -> { // primitive class
1147             boolean x = (boolean) vh.getAndSetRelease(Point.getInstance(1,1));
1148         });
1149         // Incorrect arity
1150         checkWMTE(() -> { // 0
1151             Point x = (Point) vh.getAndSetRelease();
1152         });
1153         checkWMTE(() -> { // >
1154             Point x = (Point) vh.getAndSetRelease(Point.getInstance(1,1), Void.class);
1155         });
1156 
1157 
1158     }
1159 
1160     static void testStaticFieldWrongMethodType(Handles hs) throws Throwable {
1161         int i = 0;
1162 
1163         for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) {
1164             // Incorrect return type
1165             hs.checkWMTEOrCCE(() -> { // reference class
1166                 Void x = (Void) hs.get(am, methodType(Void.class)).
1167                     invokeExact();
1168             });
1169             checkWMTE(() -> { // primitive class
1170                 boolean x = (boolean) hs.get(am, methodType(boolean.class)).
1171                     invokeExact();
1172             });
1173             // Incorrect arity
1174             checkWMTE(() -> { // >
1175                 Point x = (Point) hs.get(am, methodType(Class.class)).
1176                     invokeExact(Void.class);
1177             });
1178         }
1179 
1180         for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) {
1181             hs.checkWMTEOrCCE(() -> { // value reference class
1182                 hs.get(am, methodType(void.class, Class.class)).
1183                     invokeExact(Void.class);
1184             });
1185             // Incorrect arity
1186             checkWMTE(() -> { // 0
1187                 hs.get(am, methodType(void.class)).
1188                     invokeExact();
1189             });
1190             checkWMTE(() -> { // >
1191                 hs.get(am, methodType(void.class, Point.class, Class.class)).
1192                     invokeExact(Point.getInstance(1,1), Void.class);
1193             });
1194         }
1195         for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) {
1196             // Incorrect argument types
1197             hs.checkWMTEOrCCE(() -> { // expected reference class
1198                 boolean r = (boolean) hs.get(am, methodType(boolean.class, Class.class, Point.class)).
1199                     invokeExact(Void.class, Point.getInstance(1,1));
1200             });
1201             hs.checkWMTEOrCCE(() -> { // actual reference class
1202                 boolean r = (boolean) hs.get(am, methodType(boolean.class, Point.class, Class.class)).
1203                     invokeExact(Point.getInstance(1,1), Void.class);
1204             });
1205             // Incorrect arity
1206             checkWMTE(() -> { // 0
1207                 boolean r = (boolean) hs.get(am, methodType(boolean.class)).
1208                     invokeExact();
1209             });
1210             checkWMTE(() -> { // >
1211                 boolean r = (boolean) hs.get(am, methodType(boolean.class, Point.class, Point.class, Class.class)).
1212                     invokeExact(Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
1213             });
1214         }
1215 
1216         for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
1217             // Incorrect argument types
1218             hs.checkWMTEOrCCE(() -> { // expected reference class
1219                 Point x = (Point) hs.get(am, methodType(Point.class, Class.class, Point.class)).
1220                     invokeExact(Void.class, Point.getInstance(1,1));
1221             });
1222             hs.checkWMTEOrCCE(() -> { // actual reference class
1223                 Point x = (Point) hs.get(am, methodType(Point.class, Point.class, Class.class)).
1224                     invokeExact(Point.getInstance(1,1), Void.class);
1225             });
1226             // Incorrect return type
1227             hs.checkWMTEOrCCE(() -> { // reference class
1228                 Void r = (Void) hs.get(am, methodType(Void.class, Point.class, Point.class)).
1229                     invokeExact(Point.getInstance(1,1), Point.getInstance(1,1));
1230             });
1231             checkWMTE(() -> { // primitive class
1232                 boolean x = (boolean) hs.get(am, methodType(boolean.class, Point.class, Point.class)).
1233                     invokeExact(Point.getInstance(1,1), Point.getInstance(1,1));
1234             });
1235             // Incorrect arity
1236             checkWMTE(() -> { // 0
1237                 Point x = (Point) hs.get(am, methodType(Point.class)).
1238                     invokeExact();
1239             });
1240             checkWMTE(() -> { // >
1241                 Point x = (Point) hs.get(am, methodType(Point.class, Point.class, Point.class, Class.class)).
1242                     invokeExact(Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
1243             });
1244         }
1245 
1246         for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
1247             // Incorrect argument types
1248             hs.checkWMTEOrCCE(() -> { // value reference class
1249                 Point x = (Point) hs.get(am, methodType(Point.class, Class.class)).
1250                     invokeExact(Void.class);
1251             });
1252             // Incorrect return type
1253             hs.checkWMTEOrCCE(() -> { // reference class
1254                 Void r = (Void) hs.get(am, methodType(Void.class, Point.class)).
1255                     invokeExact(Point.getInstance(1,1));
1256             });
1257             checkWMTE(() -> { // primitive class
1258                 boolean x = (boolean) hs.get(am, methodType(boolean.class, Point.class)).
1259                     invokeExact(Point.getInstance(1,1));
1260             });
1261             // Incorrect arity
1262             checkWMTE(() -> { // 0
1263                 Point x = (Point) hs.get(am, methodType(Point.class)).
1264                     invokeExact();
1265             });
1266             checkWMTE(() -> { // >
1267                 Point x = (Point) hs.get(am, methodType(Point.class, Point.class, Class.class)).
1268                     invokeExact(Point.getInstance(1,1), Void.class);
1269             });
1270         }
1271 
1272 
1273     }
1274 
1275 
1276     static void testArrayWrongMethodType(VarHandle vh) throws Throwable {
1277         Point[] array = new Point[10];
1278         Arrays.fill(array, Point.getInstance(1,1));
1279 
1280         // Get
1281         // Incorrect argument types
1282         checkNPE(() -> { // null array
1283             Point x = (Point) vh.get(null, 0);
1284         });
1285         checkCCE(() -> { // array reference class
1286             Point x = (Point) vh.get(Void.class, 0);
1287         });
1288         checkWMTE(() -> { // array primitive class
1289             Point x = (Point) vh.get(0, 0);
1290         });
1291         checkWMTE(() -> { // index reference class
1292             Point x = (Point) vh.get(array, Void.class);
1293         });
1294         // Incorrect return type
1295         checkCCE(() -> { // reference class
1296             Void x = (Void) vh.get(array, 0);
1297         });
1298         checkWMTE(() -> { // primitive class
1299             boolean x = (boolean) vh.get(array, 0);
1300         });
1301         // Incorrect arity
1302         checkWMTE(() -> { // 0
1303             Point x = (Point) vh.get();
1304         });
1305         checkWMTE(() -> { // >
1306             Point x = (Point) vh.get(array, 0, Void.class);
1307         });
1308 
1309 
1310         // Set
1311         // Incorrect argument types
1312         checkNPE(() -> { // null array
1313             vh.set(null, 0, Point.getInstance(1,1));
1314         });
1315         checkCCE(() -> { // array reference class
1316             vh.set(Void.class, 0, Point.getInstance(1,1));
1317         });
1318         checkCCE(() -> { // value reference class
1319             vh.set(array, 0, Void.class);
1320         });
1321         checkWMTE(() -> { // receiver primitive class
1322             vh.set(0, 0, Point.getInstance(1,1));
1323         });
1324         checkWMTE(() -> { // index reference class
1325             vh.set(array, Void.class, Point.getInstance(1,1));
1326         });
1327         // Incorrect arity
1328         checkWMTE(() -> { // 0
1329             vh.set();
1330         });
1331         checkWMTE(() -> { // >
1332             vh.set(array, 0, Point.getInstance(1,1), Void.class);
1333         });
1334 
1335 
1336         // GetVolatile
1337         // Incorrect argument types
1338         checkNPE(() -> { // null array
1339             Point x = (Point) vh.getVolatile(null, 0);
1340         });
1341         checkCCE(() -> { // array reference class
1342             Point x = (Point) vh.getVolatile(Void.class, 0);
1343         });
1344         checkWMTE(() -> { // array primitive class
1345             Point x = (Point) vh.getVolatile(0, 0);
1346         });
1347         checkWMTE(() -> { // index reference class
1348             Point x = (Point) vh.getVolatile(array, Void.class);
1349         });
1350         // Incorrect return type
1351         checkCCE(() -> { // reference class
1352             Void x = (Void) vh.getVolatile(array, 0);
1353         });
1354         checkWMTE(() -> { // primitive class
1355             boolean x = (boolean) vh.getVolatile(array, 0);
1356         });
1357         // Incorrect arity
1358         checkWMTE(() -> { // 0
1359             Point x = (Point) vh.getVolatile();
1360         });
1361         checkWMTE(() -> { // >
1362             Point x = (Point) vh.getVolatile(array, 0, Void.class);
1363         });
1364 
1365 
1366         // SetVolatile
1367         // Incorrect argument types
1368         checkNPE(() -> { // null array
1369             vh.setVolatile(null, 0, Point.getInstance(1,1));
1370         });
1371         checkCCE(() -> { // array reference class
1372             vh.setVolatile(Void.class, 0, Point.getInstance(1,1));
1373         });
1374         checkCCE(() -> { // value reference class
1375             vh.setVolatile(array, 0, Void.class);
1376         });
1377         checkWMTE(() -> { // receiver primitive class
1378             vh.setVolatile(0, 0, Point.getInstance(1,1));
1379         });
1380         checkWMTE(() -> { // index reference class
1381             vh.setVolatile(array, Void.class, Point.getInstance(1,1));
1382         });
1383         // Incorrect arity
1384         checkWMTE(() -> { // 0
1385             vh.setVolatile();
1386         });
1387         checkWMTE(() -> { // >
1388             vh.setVolatile(array, 0, Point.getInstance(1,1), Void.class);
1389         });
1390 
1391 
1392         // GetOpaque
1393         // Incorrect argument types
1394         checkNPE(() -> { // null array
1395             Point x = (Point) vh.getOpaque(null, 0);
1396         });
1397         checkCCE(() -> { // array reference class
1398             Point x = (Point) vh.getOpaque(Void.class, 0);
1399         });
1400         checkWMTE(() -> { // array primitive class
1401             Point x = (Point) vh.getOpaque(0, 0);
1402         });
1403         checkWMTE(() -> { // index reference class
1404             Point x = (Point) vh.getOpaque(array, Void.class);
1405         });
1406         // Incorrect return type
1407         checkCCE(() -> { // reference class
1408             Void x = (Void) vh.getOpaque(array, 0);
1409         });
1410         checkWMTE(() -> { // primitive class
1411             boolean x = (boolean) vh.getOpaque(array, 0);
1412         });
1413         // Incorrect arity
1414         checkWMTE(() -> { // 0
1415             Point x = (Point) vh.getOpaque();
1416         });
1417         checkWMTE(() -> { // >
1418             Point x = (Point) vh.getOpaque(array, 0, Void.class);
1419         });
1420 
1421 
1422         // SetOpaque
1423         // Incorrect argument types
1424         checkNPE(() -> { // null array
1425             vh.setOpaque(null, 0, Point.getInstance(1,1));
1426         });
1427         checkCCE(() -> { // array reference class
1428             vh.setOpaque(Void.class, 0, Point.getInstance(1,1));
1429         });
1430         checkCCE(() -> { // value reference class
1431             vh.setOpaque(array, 0, Void.class);
1432         });
1433         checkWMTE(() -> { // receiver primitive class
1434             vh.setOpaque(0, 0, Point.getInstance(1,1));
1435         });
1436         checkWMTE(() -> { // index reference class
1437             vh.setOpaque(array, Void.class, Point.getInstance(1,1));
1438         });
1439         // Incorrect arity
1440         checkWMTE(() -> { // 0
1441             vh.setOpaque();
1442         });
1443         checkWMTE(() -> { // >
1444             vh.setOpaque(array, 0, Point.getInstance(1,1), Void.class);
1445         });
1446 
1447 
1448         // GetAcquire
1449         // Incorrect argument types
1450         checkNPE(() -> { // null array
1451             Point x = (Point) vh.getAcquire(null, 0);
1452         });
1453         checkCCE(() -> { // array reference class
1454             Point x = (Point) vh.getAcquire(Void.class, 0);
1455         });
1456         checkWMTE(() -> { // array primitive class
1457             Point x = (Point) vh.getAcquire(0, 0);
1458         });
1459         checkWMTE(() -> { // index reference class
1460             Point x = (Point) vh.getAcquire(array, Void.class);
1461         });
1462         // Incorrect return type
1463         checkCCE(() -> { // reference class
1464             Void x = (Void) vh.getAcquire(array, 0);
1465         });
1466         checkWMTE(() -> { // primitive class
1467             boolean x = (boolean) vh.getAcquire(array, 0);
1468         });
1469         // Incorrect arity
1470         checkWMTE(() -> { // 0
1471             Point x = (Point) vh.getAcquire();
1472         });
1473         checkWMTE(() -> { // >
1474             Point x = (Point) vh.getAcquire(array, 0, Void.class);
1475         });
1476 
1477 
1478         // SetRelease
1479         // Incorrect argument types
1480         checkNPE(() -> { // null array
1481             vh.setRelease(null, 0, Point.getInstance(1,1));
1482         });
1483         checkCCE(() -> { // array reference class
1484             vh.setRelease(Void.class, 0, Point.getInstance(1,1));
1485         });
1486         checkCCE(() -> { // value reference class
1487             vh.setRelease(array, 0, Void.class);
1488         });
1489         checkWMTE(() -> { // receiver primitive class
1490             vh.setRelease(0, 0, Point.getInstance(1,1));
1491         });
1492         checkWMTE(() -> { // index reference class
1493             vh.setRelease(array, Void.class, Point.getInstance(1,1));
1494         });
1495         // Incorrect arity
1496         checkWMTE(() -> { // 0
1497             vh.setRelease();
1498         });
1499         checkWMTE(() -> { // >
1500             vh.setRelease(array, 0, Point.getInstance(1,1), Void.class);
1501         });
1502 
1503 
1504         // CompareAndSet
1505         // Incorrect argument types
1506         checkNPE(() -> { // null receiver
1507             boolean r = vh.compareAndSet(null, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1508         });
1509         checkCCE(() -> { // receiver reference class
1510             boolean r = vh.compareAndSet(Void.class, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1511         });
1512         checkCCE(() -> { // expected reference class
1513             boolean r = vh.compareAndSet(array, 0, Void.class, Point.getInstance(1,1));
1514         });
1515         checkCCE(() -> { // actual reference class
1516             boolean r = vh.compareAndSet(array, 0, Point.getInstance(1,1), Void.class);
1517         });
1518         checkWMTE(() -> { // receiver primitive class
1519             boolean r = vh.compareAndSet(0, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1520         });
1521         checkWMTE(() -> { // index reference class
1522             boolean r = vh.compareAndSet(array, Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
1523         });
1524         // Incorrect arity
1525         checkWMTE(() -> { // 0
1526             boolean r = vh.compareAndSet();
1527         });
1528         checkWMTE(() -> { // >
1529             boolean r = vh.compareAndSet(array, 0, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
1530         });
1531 
1532 
1533         // WeakCompareAndSet
1534         // Incorrect argument types
1535         checkNPE(() -> { // null receiver
1536             boolean r = vh.weakCompareAndSetPlain(null, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1537         });
1538         checkCCE(() -> { // receiver reference class
1539             boolean r = vh.weakCompareAndSetPlain(Void.class, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1540         });
1541         checkCCE(() -> { // expected reference class
1542             boolean r = vh.weakCompareAndSetPlain(array, 0, Void.class, Point.getInstance(1,1));
1543         });
1544         checkCCE(() -> { // actual reference class
1545             boolean r = vh.weakCompareAndSetPlain(array, 0, Point.getInstance(1,1), Void.class);
1546         });
1547         checkWMTE(() -> { // receiver primitive class
1548             boolean r = vh.weakCompareAndSetPlain(0, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1549         });
1550         checkWMTE(() -> { // index reference class
1551             boolean r = vh.weakCompareAndSetPlain(array, Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
1552         });
1553         // Incorrect arity
1554         checkWMTE(() -> { // 0
1555             boolean r = vh.weakCompareAndSetPlain();
1556         });
1557         checkWMTE(() -> { // >
1558             boolean r = vh.weakCompareAndSetPlain(array, 0, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
1559         });
1560 
1561 
1562         // WeakCompareAndSetVolatile
1563         // Incorrect argument types
1564         checkNPE(() -> { // null receiver
1565             boolean r = vh.weakCompareAndSet(null, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1566         });
1567         checkCCE(() -> { // receiver reference class
1568             boolean r = vh.weakCompareAndSet(Void.class, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1569         });
1570         checkCCE(() -> { // expected reference class
1571             boolean r = vh.weakCompareAndSet(array, 0, Void.class, Point.getInstance(1,1));
1572         });
1573         checkCCE(() -> { // actual reference class
1574             boolean r = vh.weakCompareAndSet(array, 0, Point.getInstance(1,1), Void.class);
1575         });
1576         checkWMTE(() -> { // receiver primitive class
1577             boolean r = vh.weakCompareAndSet(0, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1578         });
1579         checkWMTE(() -> { // index reference class
1580             boolean r = vh.weakCompareAndSet(array, Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
1581         });
1582         // Incorrect arity
1583         checkWMTE(() -> { // 0
1584             boolean r = vh.weakCompareAndSet();
1585         });
1586         checkWMTE(() -> { // >
1587             boolean r = vh.weakCompareAndSet(array, 0, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
1588         });
1589 
1590 
1591         // WeakCompareAndSetAcquire
1592         // Incorrect argument types
1593         checkNPE(() -> { // null receiver
1594             boolean r = vh.weakCompareAndSetAcquire(null, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1595         });
1596         checkCCE(() -> { // receiver reference class
1597             boolean r = vh.weakCompareAndSetAcquire(Void.class, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1598         });
1599         checkCCE(() -> { // expected reference class
1600             boolean r = vh.weakCompareAndSetAcquire(array, 0, Void.class, Point.getInstance(1,1));
1601         });
1602         checkCCE(() -> { // actual reference class
1603             boolean r = vh.weakCompareAndSetAcquire(array, 0, Point.getInstance(1,1), Void.class);
1604         });
1605         checkWMTE(() -> { // receiver primitive class
1606             boolean r = vh.weakCompareAndSetAcquire(0, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1607         });
1608         checkWMTE(() -> { // index reference class
1609             boolean r = vh.weakCompareAndSetAcquire(array, Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
1610         });
1611         // Incorrect arity
1612         checkWMTE(() -> { // 0
1613             boolean r = vh.weakCompareAndSetAcquire();
1614         });
1615         checkWMTE(() -> { // >
1616             boolean r = vh.weakCompareAndSetAcquire(array, 0, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
1617         });
1618 
1619 
1620         // WeakCompareAndSetRelease
1621         // Incorrect argument types
1622         checkNPE(() -> { // null receiver
1623             boolean r = vh.weakCompareAndSetRelease(null, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1624         });
1625         checkCCE(() -> { // receiver reference class
1626             boolean r = vh.weakCompareAndSetRelease(Void.class, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1627         });
1628         checkCCE(() -> { // expected reference class
1629             boolean r = vh.weakCompareAndSetRelease(array, 0, Void.class, Point.getInstance(1,1));
1630         });
1631         checkCCE(() -> { // actual reference class
1632             boolean r = vh.weakCompareAndSetRelease(array, 0, Point.getInstance(1,1), Void.class);
1633         });
1634         checkWMTE(() -> { // receiver primitive class
1635             boolean r = vh.weakCompareAndSetRelease(0, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1636         });
1637         checkWMTE(() -> { // index reference class
1638             boolean r = vh.weakCompareAndSetRelease(array, Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
1639         });
1640         // Incorrect arity
1641         checkWMTE(() -> { // 0
1642             boolean r = vh.weakCompareAndSetRelease();
1643         });
1644         checkWMTE(() -> { // >
1645             boolean r = vh.weakCompareAndSetRelease(array, 0, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
1646         });
1647 
1648 
1649         // CompareAndExchange
1650         // Incorrect argument types
1651         checkNPE(() -> { // null receiver
1652             Point x = (Point) vh.compareAndExchange(null, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1653         });
1654         checkCCE(() -> { // array reference class
1655             Point x = (Point) vh.compareAndExchange(Void.class, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1656         });
1657         checkCCE(() -> { // expected reference class
1658             Point x = (Point) vh.compareAndExchange(array, 0, Void.class, Point.getInstance(1,1));
1659         });
1660         checkCCE(() -> { // actual reference class
1661             Point x = (Point) vh.compareAndExchange(array, 0, Point.getInstance(1,1), Void.class);
1662         });
1663         checkWMTE(() -> { // array primitive class
1664             Point x = (Point) vh.compareAndExchange(0, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1665         });
1666         checkWMTE(() -> { // index reference class
1667             Point x = (Point) vh.compareAndExchange(array, Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
1668         });
1669         // Incorrect return type
1670         checkCCE(() -> { // reference class
1671             Void r = (Void) vh.compareAndExchange(array, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1672         });
1673         checkWMTE(() -> { // primitive class
1674             boolean x = (boolean) vh.compareAndExchange(array, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1675         });
1676         // Incorrect arity
1677         checkWMTE(() -> { // 0
1678             Point x = (Point) vh.compareAndExchange();
1679         });
1680         checkWMTE(() -> { // >
1681             Point x = (Point) vh.compareAndExchange(array, 0, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
1682         });
1683 
1684 
1685         // CompareAndExchangeAcquire
1686         // Incorrect argument types
1687         checkNPE(() -> { // null receiver
1688             Point x = (Point) vh.compareAndExchangeAcquire(null, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1689         });
1690         checkCCE(() -> { // array reference class
1691             Point x = (Point) vh.compareAndExchangeAcquire(Void.class, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1692         });
1693         checkCCE(() -> { // expected reference class
1694             Point x = (Point) vh.compareAndExchangeAcquire(array, 0, Void.class, Point.getInstance(1,1));
1695         });
1696         checkCCE(() -> { // actual reference class
1697             Point x = (Point) vh.compareAndExchangeAcquire(array, 0, Point.getInstance(1,1), Void.class);
1698         });
1699         checkWMTE(() -> { // array primitive class
1700             Point x = (Point) vh.compareAndExchangeAcquire(0, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1701         });
1702         checkWMTE(() -> { // index reference class
1703             Point x = (Point) vh.compareAndExchangeAcquire(array, Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
1704         });
1705         // Incorrect return type
1706         checkCCE(() -> { // reference class
1707             Void r = (Void) vh.compareAndExchangeAcquire(array, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1708         });
1709         checkWMTE(() -> { // primitive class
1710             boolean x = (boolean) vh.compareAndExchangeAcquire(array, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1711         });
1712         // Incorrect arity
1713         checkWMTE(() -> { // 0
1714             Point x = (Point) vh.compareAndExchangeAcquire();
1715         });
1716         checkWMTE(() -> { // >
1717             Point x = (Point) vh.compareAndExchangeAcquire(array, 0, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
1718         });
1719 
1720 
1721         // CompareAndExchangeRelease
1722         // Incorrect argument types
1723         checkNPE(() -> { // null receiver
1724             Point x = (Point) vh.compareAndExchangeRelease(null, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1725         });
1726         checkCCE(() -> { // array reference class
1727             Point x = (Point) vh.compareAndExchangeRelease(Void.class, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1728         });
1729         checkCCE(() -> { // expected reference class
1730             Point x = (Point) vh.compareAndExchangeRelease(array, 0, Void.class, Point.getInstance(1,1));
1731         });
1732         checkCCE(() -> { // actual reference class
1733             Point x = (Point) vh.compareAndExchangeRelease(array, 0, Point.getInstance(1,1), Void.class);
1734         });
1735         checkWMTE(() -> { // array primitive class
1736             Point x = (Point) vh.compareAndExchangeRelease(0, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1737         });
1738         checkWMTE(() -> { // index reference class
1739             Point x = (Point) vh.compareAndExchangeRelease(array, Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
1740         });
1741         // Incorrect return type
1742         checkCCE(() -> { // reference class
1743             Void r = (Void) vh.compareAndExchangeRelease(array, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1744         });
1745         checkWMTE(() -> { // primitive class
1746             boolean x = (boolean) vh.compareAndExchangeRelease(array, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1747         });
1748         // Incorrect arity
1749         checkWMTE(() -> { // 0
1750             Point x = (Point) vh.compareAndExchangeRelease();
1751         });
1752         checkWMTE(() -> { // >
1753             Point x = (Point) vh.compareAndExchangeRelease(array, 0, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
1754         });
1755 
1756 
1757         // GetAndSet
1758         // Incorrect argument types
1759         checkNPE(() -> { // null array
1760             Point x = (Point) vh.getAndSet(null, 0, Point.getInstance(1,1));
1761         });
1762         checkCCE(() -> { // array reference class
1763             Point x = (Point) vh.getAndSet(Void.class, 0, Point.getInstance(1,1));
1764         });
1765         checkCCE(() -> { // value reference class
1766             Point x = (Point) vh.getAndSet(array, 0, Void.class);
1767         });
1768         checkWMTE(() -> { // reciarrayever primitive class
1769             Point x = (Point) vh.getAndSet(0, 0, Point.getInstance(1,1));
1770         });
1771         checkWMTE(() -> { // index reference class
1772             Point x = (Point) vh.getAndSet(array, Void.class, Point.getInstance(1,1));
1773         });
1774         // Incorrect return type
1775         checkCCE(() -> { // reference class
1776             Void r = (Void) vh.getAndSet(array, 0, Point.getInstance(1,1));
1777         });
1778         checkWMTE(() -> { // primitive class
1779             boolean x = (boolean) vh.getAndSet(array, 0, Point.getInstance(1,1));
1780         });
1781         // Incorrect arity
1782         checkWMTE(() -> { // 0
1783             Point x = (Point) vh.getAndSet();
1784         });
1785         checkWMTE(() -> { // >
1786             Point x = (Point) vh.getAndSet(array, 0, Point.getInstance(1,1), Void.class);
1787         });
1788 
1789 
1790         // GetAndSetAcquire
1791         // Incorrect argument types
1792         checkNPE(() -> { // null array
1793             Point x = (Point) vh.getAndSetAcquire(null, 0, Point.getInstance(1,1));
1794         });
1795         checkCCE(() -> { // array reference class
1796             Point x = (Point) vh.getAndSetAcquire(Void.class, 0, Point.getInstance(1,1));
1797         });
1798         checkCCE(() -> { // value reference class
1799             Point x = (Point) vh.getAndSetAcquire(array, 0, Void.class);
1800         });
1801         checkWMTE(() -> { // reciarrayever primitive class
1802             Point x = (Point) vh.getAndSetAcquire(0, 0, Point.getInstance(1,1));
1803         });
1804         checkWMTE(() -> { // index reference class
1805             Point x = (Point) vh.getAndSetAcquire(array, Void.class, Point.getInstance(1,1));
1806         });
1807         // Incorrect return type
1808         checkCCE(() -> { // reference class
1809             Void r = (Void) vh.getAndSetAcquire(array, 0, Point.getInstance(1,1));
1810         });
1811         checkWMTE(() -> { // primitive class
1812             boolean x = (boolean) vh.getAndSetAcquire(array, 0, Point.getInstance(1,1));
1813         });
1814         // Incorrect arity
1815         checkWMTE(() -> { // 0
1816             Point x = (Point) vh.getAndSetAcquire();
1817         });
1818         checkWMTE(() -> { // >
1819             Point x = (Point) vh.getAndSetAcquire(array, 0, Point.getInstance(1,1), Void.class);
1820         });
1821 
1822 
1823         // GetAndSetRelease
1824         // Incorrect argument types
1825         checkNPE(() -> { // null array
1826             Point x = (Point) vh.getAndSetRelease(null, 0, Point.getInstance(1,1));
1827         });
1828         checkCCE(() -> { // array reference class
1829             Point x = (Point) vh.getAndSetRelease(Void.class, 0, Point.getInstance(1,1));
1830         });
1831         checkCCE(() -> { // value reference class
1832             Point x = (Point) vh.getAndSetRelease(array, 0, Void.class);
1833         });
1834         checkWMTE(() -> { // reciarrayever primitive class
1835             Point x = (Point) vh.getAndSetRelease(0, 0, Point.getInstance(1,1));
1836         });
1837         checkWMTE(() -> { // index reference class
1838             Point x = (Point) vh.getAndSetRelease(array, Void.class, Point.getInstance(1,1));
1839         });
1840         // Incorrect return type
1841         checkCCE(() -> { // reference class
1842             Void r = (Void) vh.getAndSetRelease(array, 0, Point.getInstance(1,1));
1843         });
1844         checkWMTE(() -> { // primitive class
1845             boolean x = (boolean) vh.getAndSetRelease(array, 0, Point.getInstance(1,1));
1846         });
1847         // Incorrect arity
1848         checkWMTE(() -> { // 0
1849             Point x = (Point) vh.getAndSetRelease();
1850         });
1851         checkWMTE(() -> { // >
1852             Point x = (Point) vh.getAndSetRelease(array, 0, Point.getInstance(1,1), Void.class);
1853         });
1854 
1855 
1856     }
1857 
1858     static void testArrayWrongMethodType(Handles hs) throws Throwable {
1859         Point[] array = new Point[10];
1860         Arrays.fill(array, Point.getInstance(1,1));
1861 
1862         for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET)) {
1863             // Incorrect argument types
1864             checkNPE(() -> { // null array
1865                 Point x = (Point) hs.get(am, methodType(Point.class, Point[].class, int.class)).
1866                     invokeExact((Point[]) null, 0);
1867             });
1868             hs.checkWMTEOrCCE(() -> { // array reference class
1869                 Point x = (Point) hs.get(am, methodType(Point.class, Class.class, int.class)).
1870                     invokeExact(Void.class, 0);
1871             });
1872             checkWMTE(() -> { // array primitive class
1873                 Point x = (Point) hs.get(am, methodType(Point.class, int.class, int.class)).
1874                     invokeExact(0, 0);
1875             });
1876             checkWMTE(() -> { // index reference class
1877                 Point x = (Point) hs.get(am, methodType(Point.class, Point[].class, Class.class)).
1878                     invokeExact(array, Void.class);
1879             });
1880             // Incorrect return type
1881             hs.checkWMTEOrCCE(() -> { // reference class
1882                 Void x = (Void) hs.get(am, methodType(Void.class, Point[].class, int.class)).
1883                     invokeExact(array, 0);
1884             });
1885             checkWMTE(() -> { // primitive class
1886                 boolean x = (boolean) hs.get(am, methodType(boolean.class, Point[].class, int.class)).
1887                     invokeExact(array, 0);
1888             });
1889             // Incorrect arity
1890             checkWMTE(() -> { // 0
1891                 Point x = (Point) hs.get(am, methodType(Point.class)).
1892                     invokeExact();
1893             });
1894             checkWMTE(() -> { // >
1895                 Point x = (Point) hs.get(am, methodType(Point.class, Point[].class, int.class, Class.class)).
1896                     invokeExact(array, 0, Void.class);
1897             });
1898         }
1899 
1900         for (TestAccessMode am : testAccessModesOfType(TestAccessType.SET)) {
1901             // Incorrect argument types
1902             checkNPE(() -> { // null array
1903                 hs.get(am, methodType(void.class, Point[].class, int.class, Point.class)).
1904                     invokeExact((Point[]) null, 0, Point.getInstance(1,1));
1905             });
1906             hs.checkWMTEOrCCE(() -> { // array reference class
1907                 hs.get(am, methodType(void.class, Class.class, int.class, Point.class)).
1908                     invokeExact(Void.class, 0, Point.getInstance(1,1));
1909             });
1910             hs.checkWMTEOrCCE(() -> { // value reference class
1911                 hs.get(am, methodType(void.class, Point[].class, int.class, Class.class)).
1912                     invokeExact(array, 0, Void.class);
1913             });
1914             checkWMTE(() -> { // receiver primitive class
1915                 hs.get(am, methodType(void.class, int.class, int.class, Point.class)).
1916                     invokeExact(0, 0, Point.getInstance(1,1));
1917             });
1918             checkWMTE(() -> { // index reference class
1919                 hs.get(am, methodType(void.class, Point[].class, Class.class, Point.class)).
1920                     invokeExact(array, Void.class, Point.getInstance(1,1));
1921             });
1922             // Incorrect arity
1923             checkWMTE(() -> { // 0
1924                 hs.get(am, methodType(void.class)).
1925                     invokeExact();
1926             });
1927             checkWMTE(() -> { // >
1928                 hs.get(am, methodType(void.class, Point[].class, int.class, Class.class)).
1929                     invokeExact(array, 0, Point.getInstance(1,1), Void.class);
1930             });
1931         }
1932         for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_SET)) {
1933             // Incorrect argument types
1934             checkNPE(() -> { // null receiver
1935                 boolean r = (boolean) hs.get(am, methodType(boolean.class, Point[].class, int.class, Point.class, Point.class)).
1936                     invokeExact((Point[]) null, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1937             });
1938             hs.checkWMTEOrCCE(() -> { // receiver reference class
1939                 boolean r = (boolean) hs.get(am, methodType(boolean.class, Class.class, int.class, Point.class, Point.class)).
1940                     invokeExact(Void.class, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1941             });
1942             hs.checkWMTEOrCCE(() -> { // expected reference class
1943                 boolean r = (boolean) hs.get(am, methodType(boolean.class, Point[].class, int.class, Class.class, Point.class)).
1944                     invokeExact(array, 0, Void.class, Point.getInstance(1,1));
1945             });
1946             hs.checkWMTEOrCCE(() -> { // actual reference class
1947                 boolean r = (boolean) hs.get(am, methodType(boolean.class, Point[].class, int.class, Point.class, Class.class)).
1948                     invokeExact(array, 0, Point.getInstance(1,1), Void.class);
1949             });
1950             checkWMTE(() -> { // receiver primitive class
1951                 boolean r = (boolean) hs.get(am, methodType(boolean.class, int.class, int.class, Point.class, Point.class)).
1952                     invokeExact(0, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1953             });
1954             checkWMTE(() -> { // index reference class
1955                 boolean r = (boolean) hs.get(am, methodType(boolean.class, Point[].class, Class.class, Point.class, Point.class)).
1956                     invokeExact(array, Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
1957             });
1958             // Incorrect arity
1959             checkWMTE(() -> { // 0
1960                 boolean r = (boolean) hs.get(am, methodType(boolean.class)).
1961                     invokeExact();
1962             });
1963             checkWMTE(() -> { // >
1964                 boolean r = (boolean) hs.get(am, methodType(boolean.class, Point[].class, int.class, Point.class, Point.class, Class.class)).
1965                     invokeExact(array, 0, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
1966             });
1967         }
1968 
1969         for (TestAccessMode am : testAccessModesOfType(TestAccessType.COMPARE_AND_EXCHANGE)) {
1970             // Incorrect argument types
1971             checkNPE(() -> { // null receiver
1972                 Point x = (Point) hs.get(am, methodType(Point.class, Point[].class, int.class, Point.class, Point.class)).
1973                     invokeExact((Point[]) null, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1974             });
1975             hs.checkWMTEOrCCE(() -> { // array reference class
1976                 Point x = (Point) hs.get(am, methodType(Point.class, Class.class, int.class, Point.class, Point.class)).
1977                     invokeExact(Void.class, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1978             });
1979             hs.checkWMTEOrCCE(() -> { // expected reference class
1980                 Point x = (Point) hs.get(am, methodType(Point.class, Point[].class, int.class, Class.class, Point.class)).
1981                     invokeExact(array, 0, Void.class, Point.getInstance(1,1));
1982             });
1983             hs.checkWMTEOrCCE(() -> { // actual reference class
1984                 Point x = (Point) hs.get(am, methodType(Point.class, Point[].class, int.class, Point.class, Class.class)).
1985                     invokeExact(array, 0, Point.getInstance(1,1), Void.class);
1986             });
1987             checkWMTE(() -> { // array primitive class
1988                 Point x = (Point) hs.get(am, methodType(Point.class, int.class, int.class, Point.class, Point.class)).
1989                     invokeExact(0, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1990             });
1991             checkWMTE(() -> { // index reference class
1992                 Point x = (Point) hs.get(am, methodType(Point.class, Point[].class, Class.class, Point.class, Point.class)).
1993                     invokeExact(array, Void.class, Point.getInstance(1,1), Point.getInstance(1,1));
1994             });
1995             // Incorrect return type
1996             hs.checkWMTEOrCCE(() -> { // reference class
1997                 Void r = (Void) hs.get(am, methodType(Void.class, Point[].class, int.class, Point.class, Point.class)).
1998                     invokeExact(array, 0, Point.getInstance(1,1), Point.getInstance(1,1));
1999             });
2000             checkWMTE(() -> { // primitive class
2001                 boolean x = (boolean) hs.get(am, methodType(boolean.class, Point[].class, int.class, Point.class, Point.class)).
2002                     invokeExact(array, 0, Point.getInstance(1,1), Point.getInstance(1,1));
2003             });
2004             // Incorrect arity
2005             checkWMTE(() -> { // 0
2006                 Point x = (Point) hs.get(am, methodType(Point.class)).
2007                     invokeExact();
2008             });
2009             checkWMTE(() -> { // >
2010                 Point x = (Point) hs.get(am, methodType(Point.class, Point[].class, int.class, Point.class, Point.class, Class.class)).
2011                     invokeExact(array, 0, Point.getInstance(1,1), Point.getInstance(1,1), Void.class);
2012             });
2013         }
2014 
2015         for (TestAccessMode am : testAccessModesOfType(TestAccessType.GET_AND_SET)) {
2016             // Incorrect argument types
2017             checkNPE(() -> { // null array
2018                 Point x = (Point) hs.get(am, methodType(Point.class, Point[].class, int.class, Point.class)).
2019                     invokeExact((Point[]) null, 0, Point.getInstance(1,1));
2020             });
2021             hs.checkWMTEOrCCE(() -> { // array reference class
2022                 Point x = (Point) hs.get(am, methodType(Point.class, Class.class, int.class, Point.class)).
2023                     invokeExact(Void.class, 0, Point.getInstance(1,1));
2024             });
2025             hs.checkWMTEOrCCE(() -> { // value reference class
2026                 Point x = (Point) hs.get(am, methodType(Point.class, Point[].class, int.class, Class.class)).
2027                     invokeExact(array, 0, Void.class);
2028             });
2029             checkWMTE(() -> { // array primitive class
2030                 Point x = (Point) hs.get(am, methodType(Point.class, int.class, int.class, Point.class)).
2031                     invokeExact(0, 0, Point.getInstance(1,1));
2032             });
2033             checkWMTE(() -> { // index reference class
2034                 Point x = (Point) hs.get(am, methodType(Point.class, Point[].class, Class.class, Point.class)).
2035                     invokeExact(array, Void.class, Point.getInstance(1,1));
2036             });
2037             // Incorrect return type
2038             hs.checkWMTEOrCCE(() -> { // reference class
2039                 Void r = (Void) hs.get(am, methodType(Void.class, Point[].class, int.class, Point.class)).
2040                     invokeExact(array, 0, Point.getInstance(1,1));
2041             });
2042             checkWMTE(() -> { // primitive class
2043                 boolean x = (boolean) hs.get(am, methodType(boolean.class, Point[].class, int.class, Point.class)).
2044                     invokeExact(array, 0, Point.getInstance(1,1));
2045             });
2046             // Incorrect arity
2047             checkWMTE(() -> { // 0
2048                 Point x = (Point) hs.get(am, methodType(Point.class)).
2049                     invokeExact();
2050             });
2051             checkWMTE(() -> { // >
2052                 Point x = (Point) hs.get(am, methodType(Point.class, Point[].class, int.class, Point.class, Class.class)).
2053                     invokeExact(array, 0, Point.getInstance(1,1), Void.class);
2054             });
2055         }
2056 
2057 
2058     }
2059 }