Merge "Keep fewer default constructors in Proguard compat mode"
diff --git a/build.gradle b/build.gradle
index 716f983..08122ef 100644
--- a/build.gradle
+++ b/build.gradle
@@ -356,6 +356,7 @@
         "gmscore/gmscore_v9",
         "gmscore/gmscore_v10",
         "gmscore/latest",
+        "gradle-plugin",
         "photos/2017-06-06",
         "youtube/youtube.android_12.10",
         "youtube/youtube.android_12.17",
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
index 12429e9..aa51da1 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/JarSourceCode.java
@@ -218,8 +218,16 @@
     return (node.access & Opcodes.ACC_STATIC) > 0;
   }
 
-  private boolean isSynchronized() {
-    return (node.access & Opcodes.ACC_SYNCHRONIZED) > 0;
+  /**
+   * Determine if we should emit monitor enter/exit instructions at method entry/exit.
+   *
+   * @return true if we are generating Dex and method is marked synchronized, otherwise false.
+   */
+  private boolean generateMethodSynchronization() {
+    // When generating class files, don't treat the method specially because it is synchronized.
+    // At runtime, the JVM will automatically perform the correct monitor enter/exit instructions.
+    return !application.options.isGeneratingClassFiles()
+        && (node.access & Opcodes.ACC_SYNCHRONIZED) > 0;
   }
 
   private int formalParameterCount() {
@@ -348,7 +356,7 @@
       }
     }
 
-    if (isSynchronized()) {
+    if (generateMethodSynchronization()) {
       generatingMethodSynchronization = true;
       Type clazzType = application.getAsmType(clazz.toDescriptorString());
       int monitorRegister;
@@ -450,7 +458,7 @@
 
   @Override
   public void buildPostlude(IRBuilder builder) {
-    if (isSynchronized()) {
+    if (generateMethodSynchronization()) {
       generatingMethodSynchronization = true;
       buildMonitorExit(builder);
       generatingMethodSynchronization = false;
@@ -458,7 +466,7 @@
   }
 
   private void buildExceptionalPostlude(IRBuilder builder) {
-    assert isSynchronized();
+    assert generateMethodSynchronization();
     generatingMethodSynchronization = true;
     currentPosition = getExceptionalExitPosition();
     buildMonitorExit(builder);
@@ -748,7 +756,7 @@
         handlers.add(tryCatchBlock);
       }
     }
-    if (isSynchronized()) {
+    if (generateMethodSynchronization()) {
       // Add synchronized exceptional exit for synchronized-method instructions without a default.
       assert handlers.isEmpty() || handlers.get(handlers.size() - 1).getType() != null;
       handlers.add(EXCEPTIONAL_SYNC_EXIT);
@@ -2296,7 +2304,7 @@
     if (handlers.isEmpty()) {
       return true;
     }
-    if (!isSynchronized() || handlers.size() > 1) {
+    if (!generateMethodSynchronization() || handlers.size() > 1) {
       return false;
     }
     return handlers.get(0) == EXCEPTIONAL_SYNC_EXIT;
diff --git a/src/test/java/com/android/tools/r8/cf/SynchronizedNoopTestRunner.java b/src/test/java/com/android/tools/r8/cf/SynchronizedNoopTestRunner.java
index 20acb9f..7565dee 100644
--- a/src/test/java/com/android/tools/r8/cf/SynchronizedNoopTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/SynchronizedNoopTestRunner.java
@@ -6,6 +6,8 @@
 
 package com.android.tools.r8.cf;
 
+import static org.junit.Assert.assertFalse;
+
 import com.android.tools.r8.R8;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.ToolHelper;
@@ -53,7 +55,6 @@
                 insn ->
                     insn.getOpcode() == Opcodes.MONITORENTER
                         || insn.getOpcode() == Opcodes.MONITOREXIT);
-    // TODO(b/73921688): Should not have monitor instruction here
-    assert hasMonitor;
+    assertFalse(hasMonitor);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
index fbb14f1..60ed129 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
@@ -233,7 +233,7 @@
     }
 
     AndroidApp app = compileWithR8(jasminBuilder.build(),
-        keepMainProguardConfiguration("Foo") + "\ndontobfuscate");
+        keepMainProguardConfiguration("Foo") + "\n-dontobfuscate");
     String artOutput = runOnArt(app, "Foo");
     System.out.println(artOutput);
   }
diff --git a/third_party/gradle-plugin.tar.gz.sha1 b/third_party/gradle-plugin.tar.gz.sha1
new file mode 100644
index 0000000..2fd1633
--- /dev/null
+++ b/third_party/gradle-plugin.tar.gz.sha1
@@ -0,0 +1 @@
+a0bea68a3b71d485296fe6aec54f995cdb6dd300
\ No newline at end of file