/* * @test /nodynamiccopyright/ * @bug 8223305 8226522 * @summary Verify correct warnings w.r.t. yield * @compile/ref=WarnWrongYieldTest.out --release 13 -XDrawDiagnostics -XDshould-stop.ifError=ATTR -XDshould-stop.ifNoError=ATTR WarnWrongYieldTest.java */ package t; //ERROR - type called yield: import t.WarnWrongYieldTest.yield; public class WarnWrongYieldTest { // ERROR - class called yield class yield { } // OK to have fields called yield String[] yield = null; // ERROR - field of type yield yield y; // OK to have methods called yield // Nullary yield method String[] yield() { return null; } // Unary yield method String[] yield(int i) { return null; } // Binary yield method String[] yield(int i, int j) { return null; } // OK to declare a local called yield void LocalDeclaration1() { int yield; } // OK to declare and initialise a local called yield void LocalDeclaration2() { int yield = 42; } void YieldTypedLocals(int i) { // ERROR - Parsed as yield statement, and y1 is unknown yield y1 = null; // ERROR - Parsed as yield statement, and y2 is unknown yield y2 = new yield(); // ERROR - can not create an yield-valued local of type Object Object y3 = new yield(); // ERROR - can not create a final yield-valued local of type yield final yield y4 = new yield(); // ERROR - can create a non-final local of type yield using qualified typename WarnWrongYieldTest.yield y5 = new yield(); } void MethodInvocation(int i) { // OK - can access a field called yield String[] x = this.yield; // ERROR - calling nullary yield method using simple name parsed as yield statement yield(); // OK - can call nullary yield method using qualified name this.yield(); // ERROR - Calling unary yield method using simple name is parsed as yield statement yield(2); // OK - calling unary yield method using qualified name this.yield(2); // ERROR - Calling binary yield method using simple name is parsed as yield statement yield(2, 2); //error // OK - calling binary yield method using qualified name this.yield(2, 2); // ERROR - nullary yield method as receiver is parsed as yield statement yield().toString(); // OK - nullary yield method as receiver using qualified name this.yield().toString(); // ERROR - unary yield method as receiver is parsed as yield statement yield(2).toString(); // OK - unary yield method as receiver using qualified name this.yield(2).toString(); // ERROR - binary yield method as receiver is parsed as yield statement yield(2, 2).toString(); // OK - binary yield method as receiver using qualified name this.yield(2, 2).toString(); // OK - yield method call is in an expression position String str = yield(2).toString(); //OK - yield is a variable yield.toString(); // OK - parsed as method call (with qualified local yield as receiver) this.yield.toString(); yield[0].toString(); //error } private void yieldLocalVar1(int i) { int yield = 0; //OK - yield is a variable: yield++; yield--; //OK - yield is a variable: yield = 3; //OK - yield is a variable: for (int j = 0; j < 3; j++) yield += 1; //OK - yield is a variable and not at the beginning of the statement: yieldLocalVar1(yield); //ERROR - unqualified yield method invocation: yieldLocalVar1(yield().length); yieldLocalVar1(yield.class.getModifiers()); } private void yieldLocalVar2(int i) { int[] yield = new int[1]; //OK - yield is a variable: yield[0] = 5; } private void lambda() { SAM s = (yield y) -> {}; } interface SAM { public void m(yield o); } }