content: /*
   * Copyright (C) 2011 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  class Main {
  
      public int ifoo;
  
      /* Test requires visual inspection of object code to verify */
      int noThrow(Main nonNullA,
                  Main nonNullB,
                  Main nonNullC) {
  
          // "this" check should be eliminated on both IGET/IPUT
          ifoo++;
  
         // "this" check should be eliminated on both IGET/IPUT
         if (ifoo != 321) {
             // Check not eliminated
             nonNullA.ifoo = 12;
             // Check not eliminated
             nonNullB.ifoo = 21;
         } else {
             // Check not eliminated
             nonNullA.ifoo = 12;
         }
  
         // Check eliminated
         nonNullA.ifoo = 13;
  
         // Check not eliminated
         nonNullB.ifoo = 21;
  
         nonNullC = nonNullB;
  
         // Check eliminated
         nonNullC.ifoo = 32;
  
        // All null checks eliminated
        return ifoo + nonNullA.ifoo + nonNullB.ifoo + nonNullC.ifoo;
      }
  
      /* Test to ensure we don't remove necessary null checks */
      int checkThrow(Main nonNullA,
                     Main nonNullB,
                     Main nonNullC,
                     Main nullA,
                     Main nullB,
                     Main nullC) {
  
          // "this" check should be eliminated on both IGET/IPUT
          ifoo++;
  
         try {
             nullA.ifoo = 12;
             // Should not be reached
             return -1;
         } catch (NullPointerException npe) {
             ifoo++;
         }
         try {
             nullB.ifoo = 13;
             // Should not be reached
             return -2;
         } catch (NullPointerException npe) {
             ifoo++;
         }
         try {
             nullC.ifoo = 14;
             // Should not be reached
             return -3;
         } catch (NullPointerException npe) {
             ifoo++;
         }
  
         // "this" check should be eliminated
         if (ifoo != 321) {
             // Check not eliminated
             nonNullA.ifoo = 12;
             // Check not eliminated
             nonNullB.ifoo = 21;
             // Should throw here
             try {
                 nullA.ifoo = 11;
                 return -4;
             } catch (NullPointerException npe) {
             }
         } else {
             // Check not eliminated
             nonNullA.ifoo = 12;
             // Should throw here
             try {
                 nullA.ifoo = 11;
                 return -5;
             } catch (NullPointerException npe) {
             }
         }
  
         // Check not eliminated
         nonNullA.ifoo = 13;
  
         // Check not eliminated
         nonNullB.ifoo = 21;
  
         nonNullC = nonNullB;
  
         // Check eliminated
         nonNullC.ifoo = 32;
  
         // Should throw here
         try {
             nullA.ifoo = 13;
             return -6;
         } catch (NullPointerException npe) {
         }
  
        return ifoo + nonNullA.ifoo + nonNullB.ifoo + nonNullC.ifoo;
      }
  
  
      static int nullCheckTestNoThrow(int x) {
          Main base = new Main();
          Main a = new Main();
          Main b = new Main();
          Main c = new Main();
          base.ifoo = x;
          return base.noThrow(a,b,c);
      }
  
      static int nullCheckTestThrow(int x) {
          Main base = new Main();
          Main a = new Main();
          Main b = new Main();
          Main c = new Main();
          Main d = null;
          Main e = null;
          Main f = null;
          base.ifoo = x;
          return base.checkThrow(a,b,c,d,e,f);
      }
  
  
      static void throwImplicitAIOBE(int[] array, int index) {
        array[index] = 0;
      }
  
      static int checkAIOBE() {
        int[] array = new int[10];
        int res;
        try {
          throwImplicitAIOBE(array, 11);
          res = 123;
        } catch (NullPointerException npe) {
          res = 768;
        } catch (ArrayIndexOutOfBoundsException e) {
          res = 456;
        }
        try {
          throwImplicitAIOBE(array, -1);
          res += 123;
        } catch (NullPointerException npe) {
          res += 768;
        } catch (ArrayIndexOutOfBoundsException e) {
          res += 456;
        }
        return res;
      }
  
      static int throwImplicitDivZero(int x, int y) {
        return x / y;
      }
  
      static int checkDivZero() {
        try {
          throwImplicitDivZero(100, 0);
          return 123;
        } catch (NullPointerException npe) {
          return 768;
        } catch (ArrayIndexOutOfBoundsException e) {
          return 987;
        } catch (ArithmeticException e) {
          return 456;
        }
      }
  
      public static void main(String[] args) {
          boolean failure = false;
          int res;
  
          res = nullCheckTestNoThrow(1976);
          if (res == 2054) {
              System.out.println("nullCheckTestNoThrow PASSED");
          } else {
              System.out.println("nullCheckTestNoThrow FAILED: " + res);
              failure = true;
          }
  
          res = nullCheckTestThrow(1976);
          if (res == 2057) {
              System.out.println("nullCheckTestThrow PASSED");
          } else {
              System.out.println("nullCheckTestThrow FAILED: " + res);
              failure = true;
          }
  
          res = checkAIOBE();
          if (res == 912) {
            System.out.println("checkAIOBE PASSED");
          } else {
            System.out.println("checkAIOBE FAILED: " + res);
            failure = true;
          }
  
          res = checkDivZero();
          if (res == 456) {
            System.out.println("checkDivZero PASSED");
          } else {
            System.out.println("checkDivZero FAILED: " + res);
            failure = true;
          }
          System.exit(failure ? 1 : 0);
      }
  }
  