// Test case for Issue 548:
// https://github.com/typetools/checker-framework/issues/548

public class TryFinallyBreak {
  String testWhile1() {
    String ans = "x";
    while (this.hashCode() > 10000) {
      try {
        // empty body
      } finally {
        ans = null;
      }
    }
    // :: error: (return)
    return ans;
  }

  String testWhile2() {
    String ans = "x";
    while (true) {
      try {
        // Note the additional break;
        break;
      } finally {
        ans = null;
      }
    }
    // :: error: (return)
    return ans;
  }

  String testWhile3() {
    String ans = "x";
    while (true) {
      try {
        testWhile3();
      } catch (Exception e) {
        break;
      } finally {
        ans = null;
      }
      ans = "x";
    }
    // :: error: (return)
    return ans;
  }

  String testWhile4() {
    String ans = "x";
    while (true) {
      if (true) {
        try {
          break;
        } finally {
          ans = null;
          break;
        }
      }
      ans = "x";
    }
    // :: error: (return)
    return ans;
  }

  String testWhile5() {
    String ans = "x";
    while (true) {
      while (true) {
        try {
          // Note the additional break;
          break;
        } finally {
          ans = null;
        }
      }
      ans = "x";
      break;
    }
    return ans;
  }

  String testWhile6(boolean cond) {
    String ans = "x";
    OUTER:
    while (cond) {
      while (cond) {
        try {
          if (cond) {
            break OUTER;
          }
        } finally {
          ans = null;
        }
      }
      ans = "x";
    }
    // :: error: (return)
    return ans;
  }

  String testWhile7(boolean cond) {
    String ans = "x";
    OUTER:
    while (cond) {
      try {
        while (cond) {
          try {
            if (cond) {
              break OUTER;
            }
          } finally {
            ans = null;
          }
        }
      } finally {
        ans = "x";
      }
    }
    return ans;
  }

  String testWhile8(boolean cond) {
    String ans = "x";
    OUTER:
    while (cond) {
      try {
        while (cond) {
          try {
            if (cond) {
              break OUTER;
            }
          } finally {
            ans = "x";
          }
        }
      } finally {
        ans = null;
      }
    }
    // :: error: (return)
    return ans;
  }

  String testDoWhile1() {
    String ans = "x";
    do {
      try {
        // empty body
      } finally {
        ans = null;
      }
    } while (this.hashCode() > 10000);
    // :: error: (return)
    return ans;
  }

  String testDoWhile2() {
    String ans = "x";
    do {
      try {
        // Note the additional break;
        break;
      } finally {
        ans = null;
      }
    } while (true);
    // :: error: (return)
    return ans;
  }

  String testDoWhile3() {
    String ans = "x";
    do {
      try {
        testWhile3();
      } catch (Exception e) {
        break;
      } finally {
        ans = null;
      }
      ans = "x";
    } while (true);
    // :: error: (return)
    return ans;
  }

  String testDoWhile4() {
    String ans = "x";
    do {
      if (true) {
        try {
          break;
        } finally {
          ans = null;
          break;
        }
      }
      ans = "x";
    } while (true);
    // :: error: (return)
    return ans;
  }

  String testDoWhile5() {
    String ans = "x";
    do {
      do {
        try {
          // Note the additional break;
          break;
        } finally {
          ans = null;
        }
      } while (true);
      ans = "x";
      break;
    } while (true);
    return ans;
  }

  String testDoWhile6(boolean cond) {
    String ans = "x";
    OUTER:
    do {
      do {
        try {
          if (cond) {
            break OUTER;
          }
        } finally {
          ans = null;
        }
      } while (cond);
      ans = "x";
    } while (cond);
    // :: error: (return)
    return ans;
  }

  String testDoWhile7(boolean cond) {
    String ans = "x";
    OUTER:
    do {
      try {
        do {
          try {
            if (cond) {
              break OUTER;
            }
          } finally {
            ans = null;
          }
        } while (cond);
      } finally {
        ans = "x";
      }
    } while (cond);
    return ans;
  }

  String testDoWhile8(boolean cond) {
    String ans = "x";
    OUTER:
    do {
      try {
        do {
          try {
            if (cond) {
              break OUTER;
            }
          } finally {
            ans = "x";
          }
        } while (cond);
      } finally {
        ans = null;
      }
    } while (cond);
    // :: error: (return)
    return ans;
  }

  String testFor1() {
    String ans = "x";
    for (; this.hashCode() > 10000; ) {
      try {
        // empty body
      } finally {
        ans = null;
      }
    }
    // :: error: (return)
    return ans;
  }

  String testFor2() {
    String ans = "x";
    for (; ; ) {
      try {
        // Note the additional break;
        break;
      } finally {
        ans = null;
      }
    }
    // :: error: (return)
    return ans;
  }

  String testFor3() {
    String ans = "x";
    for (; ; ) {
      try {
        testFor3();
      } catch (Exception e) {
        break;
      } finally {
        ans = null;
      }
      ans = "x";
    }
    // :: error: (return)
    return ans;
  }

  String testFor4() {
    String ans = "x";
    for (; ; ) {
      if (true) {
        try {
          break;
        } finally {
          ans = null;
          break;
        }
      }
      ans = "x";
    }
    // :: error: (return)
    return ans;
  }

  String testFor5() {
    String ans = "x";
    for (; ; ) {
      for (; ; ) {
        try {
          // Note the additional break;
          break;
        } finally {
          ans = null;
        }
      }
      ans = "x";
      break;
    }
    return ans;
  }

  String testFor6(boolean cond) {
    String ans = "x";
    OUTER:
    for (; ; ) {
      for (; cond; ) {
        try {
          if (cond) {
            break OUTER;
          }
        } finally {
          ans = null;
        }
      }
      ans = "x";
    }
    // :: error: (return)
    return ans;
  }

  String testFor7(boolean cond) {
    String ans = "x";
    OUTER:
    for (; ; ) {
      try {
        for (; ; ) {
          try {
            if (cond) {
              break OUTER;
            }
          } finally {
            ans = null;
          }
        }
      } finally {
        ans = "x";
      }
    }
    return ans;
  }

  String testFor8(boolean cond) {
    String ans = "x";
    OUTER:
    for (; ; ) {
      try {
        for (; ; ) {
          try {
            if (cond) {
              break OUTER;
            }
          } finally {
            ans = "x";
          }
        }
      } finally {
        ans = null;
      }
    }
    // :: error: (return)
    return ans;
  }

  String testIf1() {
    String ans = "x";
    IF:
    if (true) {
      try {
        break IF;
      } finally {
        ans = null;
      }
    }
    // :: error: (return)
    return ans;
  }

  String testIf2(boolean cond) {
    String ans = "x";
    IF:
    if (cond) {
      if (cond) {
        try {
          if (cond) {
            break IF;
          }
        } finally {
          ans = null;
        }
      }
      ans = "x";
    }
    // :: error: (return)
    return ans;
  }

  String testIf3(boolean cond) {
    String ans = "x";
    IF:
    if (cond) {
      try {
        if (cond) {
          try {
            if (cond) {
              break IF;
            }
          } finally {
            ans = null;
          }
        }
      } finally {
        ans = "x";
      }
    }
    return ans;
  }

  String testIf4(boolean cond) {
    String ans = "x";
    IF:
    if (cond) {
      try {
        if (cond) {
          try {
            if (cond) {
              break IF;
            }
          } finally {
            ans = "x";
          }
        }
      } finally {
        ans = null;
      }
    }
    // :: error: (return)
    return ans;
  }

  String testSwitch1() {
    String ans = "x";
    switch (ans) {
      case "x":
        try {
          break;
        } finally {
          ans = null;
        }
    }
    // :: error: (return)
    return ans;
  }

  String testSwitch2(boolean cond) {
    String ans = "x";
    SWITCH:
    switch (ans) {
      case "x":
        switch (ans) {
          case "x":
            try {
              break SWITCH;
            } finally {
              ans = null;
            }
        }
    }
    // :: error: (return)
    return ans;
  }

  String testSwitch3(boolean cond) {
    String ans = "x";
    SWITCH:
    switch (ans) {
      case "x":
        try {
          switch (ans) {
            case "x":
              try {
                break SWITCH;
              } finally {
                ans = null;
              }
          }
        } finally {
          ans = "x";
        }
    }
    return ans;
  }

  String testSwitch4(boolean cond) {
    String ans = "x";
    SWITCH:
    switch (ans) {
      case "x":
        try {
          switch (ans) {
            case "x":
              try {
                break SWITCH;
              } finally {
                ans = "x";
              }
          }
        } finally {
          ans = null;
        }
    }
    // :: error: (return)
    return ans;
  }
}
