# Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

.class LTest;
.super Ljava/lang/Object;

# Fall through to catch block.
.method public test1()V
    .registers 1
    :try_start
    monitor-enter p0
    monitor-exit  p0
    :try_end
    return-void
    .catchall {:try_start .. :try_end} :try_end
.end method

.method public static test2()I
    .locals 1
    const v0, 0
    :try_start
    const v0, 1
    goto :return
    :try_end
    .catch Ljava/lang/Exception; {:try_start .. :try_end} :return
    .catch Ljava/lang/Throwable; {:try_start .. :try_end} :error
    :error
    move-exception v0
    const v0, 2
    :return
    return v0
.end method

.method public static test2_throw()I
    .locals 1
    const v0, 1
    :try_start
    invoke-static {}, Ltest/X;->f()V
    const v0, 0
    goto :return
    :try_end
    .catch Ljava/lang/Exception; {:try_start .. :try_end} :return
    .catch Ljava/lang/Throwable; {:try_start .. :try_end} :error
    :error
    move-exception v0
    throw v0
    :return
    return v0
.end method

# Dead catch block.
.method public test3()I
    .locals 1
    const v0, 0
    return v0
    :start
    nop
    :end
    .catchall {:start .. :end} :catch
    nop
    :catch
    nop
.end method

.method public static main([Ljava/lang/String;)V
    .locals 0
    return-void
.end method

.method public test4(I)V
    .locals 1
    const/4 v0, 0
    if-nez p0, :not_zero
    const/4 v0, 1
    goto :try_end
    :not_zero
    const/4 v0, 2
    :try_start
    invoke-static {}, Ltest/X;->f()V
    const/4 v0, 3
    :try_end
    return-void
    .catchall {:try_start .. :try_end} :try_end
.end method

.method public f()V
    .locals 0
    return-void
.end method
