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