Some test cases for switch expression

Brian Goetz brian.goetz at oracle.com
Mon Apr 16 17:14:31 UTC 2018


I wrote up some simple (negative) test cases for switch expressions.  
Found one bug and a few places where we might want to firm up the error 
messages.

// Negative test
// sswitch, for-loop embedded in eswitch, where ss to break out of es

class N1 {
     int m(int x) {
         return switch (x) {
         case 0:
             switch (x) {
             case 0: break 1; // illegal
             }
             break 0;
         default -> -1;
         };
     }

     int n(int x) {
         return switch (x) {
         case 0:
             for (int i=0; i<10; i++) {
                 break 1; // illegal
             }
             break 0;
         default -> -1;
         };
     }
}

This compiles fine, so this is a bug -- the break-e out of the embedded 
switch and for-loop is illegal.

// Negative test
// Warn on ambiguity between label and variable in eswitch/sswitch break

class N2 {
     public int m(int x) {
         int label = 0;

         label:
         do {
             return switch (x) {
             case 1: break label; // warning expected
             };
         } while (false);
     }

     public void n(int x) {
         int label = 0;

         label:
         do {
             int y = switch (x) {
                 case 0:
                     switch (x) {
                         case 1: break label; // warning expected
                     };
                     break 0;
                 case 1:
                     break label; // warning expected
             };
         } while (false);
     }
}

This gives the expected (3) warnings.

// Negative test
// sswitch in eswitch in loop, attempt to break through eswitch
// equivalent with lambda, for comparison of diagnostics

class N3 {
     void m(int x) {
         loop:
         while (true) {
             int y = switch (x) {
             case 0:
             switch (x) {
             case 0: break loop;
             }
             };
         }
     }

     void n(int x) {
         loop:
         while (true) {
             Runnable r = () -> {
                 switch (x) {
                 case 0: break loop;
                 }
             };
         }
     }
}

This gives the expected (2) errors, but the messages are different:

N3.java:12: error: break is jumping outside of the enclosing switch 
expression
             case 0: break loop;
                     ^
N3.java:23: error: undefined label: loop
                 case 0: break loop;
                         ^
2 errors

// Negative test
// eswitch embedded in sswitch, where es attempts to break out of ss

class N4 {
     void m(int x) {
         sw:
         switch (x) {
         case 0:
             int y = switch (x) {
                 case 0: break;         // error
                 case 1: break sw;      // error
             };
         }
     }

     // same with lambda
     void m(int x) {
         sw:
         switch (x) {
         case 0:
             Runnable r1 = () -> { break; };
             Runnable r2 = () -> { break sw; };
         }
     }
}

This gives the expected errors, though again the error messages are not 
the same as with the corresponding lambdas, and the errors for the 
lambda cases are also not entirely consistent with each other:

N4.java:10: error: break is missing a value to return from switch expression
                 case 0: break;         // error
                         ^
N4.java:11: error: break is jumping outside of the enclosing switch 
expression
                 case 1: break sw;      // error
                         ^
N4.java:21: error: break outside switch or loop
             Runnable r1 = () -> { break; };
                                   ^
N4.java:22: error: undefined label: sw
             Runnable r2 = () -> { break sw; };
                                   ^





More information about the amber-dev mailing list