Update to support Java 17

Support class files with version 61.

Move all use of JDK 16 for testing new features to JDK 17,
leaving JDK 16 not used for testing any more.

Removed all use of --enable-preview, as no tested features are
preview on JDK 17.

Content of README.google:
Name: Java Development Kit (JDK)
URL: https://jdk.java.net/17/
Version: 17
Revision: NA
License: the GNU General Public License, version 2, with the Classpath Exception.

Description:
This is pulled directly from the website for the JDK releases that has an open source license.
Synlinks have reen resolved using `cp -rL` before uploading.
Change-Id: I9526ce07e8911c21d5ad75b628fa4ab6fe9c2f9f
diff --git a/.gitignore b/.gitignore
index 885f76d..5f174a0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -131,6 +131,12 @@
 third_party/openjdk/desugar_jdk_libs_releases/1.1.1.tar.gz
 third_party/openjdk/desugar_jdk_libs_releases/1.1.5
 third_party/openjdk/desugar_jdk_libs_releases/1.1.5.tar.gz
+third_party/openjdk/jdk-17/linux
+third_party/openjdk/jdk-17/linux.tar.gz
+third_party/openjdk/jdk-17/osx
+third_party/openjdk/jdk-17/osx.tar.gz
+third_party/openjdk/jdk-17/windows
+third_party/openjdk/jdk-17/windows.tar.gz
 third_party/openjdk/jdk-16/linux
 third_party/openjdk/jdk-16/linux.tar.gz
 third_party/openjdk/jdk-16/osx
diff --git a/build.gradle b/build.gradle
index 7d9e939..68b9ecd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -131,9 +131,9 @@
             srcDirs = ['src/test/examplesJava11']
         }
     }
-    examplesJava16 {
+    examplesJava17 {
         java {
-            srcDirs = ['src/test/examplesJava16']
+            srcDirs = ['src/test/examplesJava17']
         }
     }
     jdk11TimeTests {
@@ -375,18 +375,18 @@
                 "third_party": ["openjdk/openjdk-9.0.4/linux",
                                 "openjdk/jdk8/linux-x86",
                                 "openjdk/jdk-11/linux",
-                                "openjdk/jdk-16/linux"],
+                                "openjdk/jdk-17/linux"],
         ],
         osx: [
                 "third_party": ["openjdk/openjdk-9.0.4/osx",
                                 "openjdk/jdk8/darwin-x86",
                                 "openjdk/jdk-11/osx",
-                                "openjdk/jdk-16/osx"],
+                                "openjdk/jdk-17/osx"],
         ],
         windows: [
                 "third_party": ["openjdk/openjdk-9.0.4/windows",
                                 "openjdk/jdk-11/windows",
-                                "openjdk/jdk-16/windows"],
+                                "openjdk/jdk-17/windows"],
         ],
 ]
 
@@ -625,10 +625,10 @@
         JavaVersion.VERSION_11,
         false)
 setJdkCompilationWithCompatibility(
-        sourceSets.examplesJava16.compileJavaTaskName,
-        'jdk-16',
-        JavaVersion.VERSION_16,
-        true)
+        sourceSets.examplesJava17.compileJavaTaskName,
+        'jdk-17',
+        JavaVersion.VERSION_17,
+        false)
 
 task compileMainWithJava11 (type: JavaCompile) {
     dependsOn downloadDeps
@@ -1597,7 +1597,7 @@
 buildExampleJarsCreateTask("Java9", sourceSets.examplesJava9)
 buildExampleJarsCreateTask("Java10", sourceSets.examplesJava10)
 buildExampleJarsCreateTask("Java11", sourceSets.examplesJava11)
-buildExampleJarsCreateTask("Java16", sourceSets.examplesJava16)
+buildExampleJarsCreateTask("Java17", sourceSets.examplesJava17)
 
 task provideArtFrameworksDependencies {
     cloudDependencies.tools.forEach({ art ->
@@ -1680,7 +1680,7 @@
     dependsOn buildExampleJava9Jars
     dependsOn buildExampleJava10Jars
     dependsOn buildExampleJava11Jars
-    dependsOn buildExampleJava16Jars
+    dependsOn buildExampleJava17Jars
     dependsOn buildExampleAndroidApi
     def examplesDir = file("src/test/examples")
     def noDexTests = [
diff --git a/scripts/add-openjdk.sh b/scripts/add-openjdk.sh
old mode 100644
new mode 100755
index 8587b93..6f8bada
--- a/scripts/add-openjdk.sh
+++ b/scripts/add-openjdk.sh
@@ -16,9 +16,9 @@
 # Prepare README.google
 # Update JDK_VERSION below
 
-# Now run script wit fingers crossed!
+# Now run script with fingers crossed!
 
-JDK_VERSION=16.0.2
+JDK_VERSION=17
 
 tar xf ~/Downloads/openjdk-${JDK_VERSION}_linux-x64_bin.tar.gz
 cp -rL jdk-${JDK_VERSION} linux
@@ -28,7 +28,7 @@
 rm -rf linux
 rm linux.tar.gz
 
-tar xf ~/Downloads/openjdk-${JDK_VERSION}_osx-x64_bin.tar.gz
+tar xf ~/Downloads/openjdk-${JDK_VERSION}_macos-x64_bin.tar.gz
 cp -rL jdk-${JDK_VERSION}.jdk osx
 cp README.google osx
 upload_to_google_storage.py -a --bucket r8-deps osx
@@ -43,3 +43,7 @@
 rm -rf windows
 rm -rf jdk-${JDK_VERSION}
 rm windows.tar.gz
+
+git add *.sha1
+
+echo "Update additional files, see https://r8-review.googlesource.com/c/r8/+/61909"
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/r8/cf/CfVersion.java b/src/main/java/com/android/tools/r8/cf/CfVersion.java
index 5b877b8..b23d44d 100644
--- a/src/main/java/com/android/tools/r8/cf/CfVersion.java
+++ b/src/main/java/com/android/tools/r8/cf/CfVersion.java
@@ -36,6 +36,8 @@
   public static final CfVersion V15_PREVIEW = new CfVersion(Opcodes.V15 | Opcodes.V_PREVIEW);
   public static final CfVersion V16 = new CfVersion(Opcodes.V16);
   public static final CfVersion V16_PREVIEW = new CfVersion(Opcodes.V16 | Opcodes.V_PREVIEW);
+  public static final CfVersion V17 = new CfVersion(Opcodes.V17);
+  public static final CfVersion V17_PREVIEW = new CfVersion(Opcodes.V17 | Opcodes.V_PREVIEW);
 
   private final int version;
 
@@ -55,7 +57,8 @@
     CfVersion.V13,
     CfVersion.V14,
     CfVersion.V15,
-    CfVersion.V16
+    CfVersion.V16,
+    CfVersion.V17
   };
 
   // Private constructor in case we want to canonicalize versions.
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index ff6cad4..4254229 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -124,7 +124,7 @@
     }
   }
 
-  public static final CfVersion SUPPORTED_CF_VERSION = CfVersion.V16_PREVIEW;
+  public static final CfVersion SUPPORTED_CF_VERSION = CfVersion.V17;
   public static final CfVersion EXPERIMENTAL_CF_VERSION = CfVersion.V12;
 
   public static final int SUPPORTED_DEX_VERSION =
diff --git a/src/test/examplesJava16/pattern_matching_for_instanceof/Main.java b/src/test/examplesJava17/pattern_matching_for_instanceof/Main.java
similarity index 100%
rename from src/test/examplesJava16/pattern_matching_for_instanceof/Main.java
rename to src/test/examplesJava17/pattern_matching_for_instanceof/Main.java
diff --git a/src/test/examplesJava16/records/EmptyRecord.java b/src/test/examplesJava17/records/EmptyRecord.java
similarity index 100%
rename from src/test/examplesJava16/records/EmptyRecord.java
rename to src/test/examplesJava17/records/EmptyRecord.java
diff --git a/src/test/examplesJava16/records/RecordInstanceOf.java b/src/test/examplesJava17/records/RecordInstanceOf.java
similarity index 100%
rename from src/test/examplesJava16/records/RecordInstanceOf.java
rename to src/test/examplesJava17/records/RecordInstanceOf.java
diff --git a/src/test/examplesJava16/records/RecordInvokeCustom.java b/src/test/examplesJava17/records/RecordInvokeCustom.java
similarity index 100%
rename from src/test/examplesJava16/records/RecordInvokeCustom.java
rename to src/test/examplesJava17/records/RecordInvokeCustom.java
diff --git a/src/test/examplesJava16/records/RecordReflection.java b/src/test/examplesJava17/records/RecordReflection.java
similarity index 100%
rename from src/test/examplesJava16/records/RecordReflection.java
rename to src/test/examplesJava17/records/RecordReflection.java
diff --git a/src/test/examplesJava16/records/RecordWithMembers.java b/src/test/examplesJava17/records/RecordWithMembers.java
similarity index 100%
rename from src/test/examplesJava16/records/RecordWithMembers.java
rename to src/test/examplesJava17/records/RecordWithMembers.java
diff --git a/src/test/examplesJava16/records/SimpleRecord.java b/src/test/examplesJava17/records/SimpleRecord.java
similarity index 100%
rename from src/test/examplesJava16/records/SimpleRecord.java
rename to src/test/examplesJava17/records/SimpleRecord.java
diff --git a/src/test/examplesJava16/sealed/Compiler.java b/src/test/examplesJava17/sealed/Compiler.java
similarity index 100%
rename from src/test/examplesJava16/sealed/Compiler.java
rename to src/test/examplesJava17/sealed/Compiler.java
diff --git a/src/test/examplesJava16/sealed/D8Compiler.java b/src/test/examplesJava17/sealed/D8Compiler.java
similarity index 100%
rename from src/test/examplesJava16/sealed/D8Compiler.java
rename to src/test/examplesJava17/sealed/D8Compiler.java
diff --git a/src/test/examplesJava16/sealed/Main.java b/src/test/examplesJava17/sealed/Main.java
similarity index 100%
rename from src/test/examplesJava16/sealed/Main.java
rename to src/test/examplesJava17/sealed/Main.java
diff --git a/src/test/examplesJava16/sealed/R8Compiler.java b/src/test/examplesJava17/sealed/R8Compiler.java
similarity index 100%
rename from src/test/examplesJava16/sealed/R8Compiler.java
rename to src/test/examplesJava17/sealed/R8Compiler.java
diff --git a/src/test/java/com/android/tools/r8/TestRuntime.java b/src/test/java/com/android/tools/r8/TestRuntime.java
index 6fd2f96..90600af 100644
--- a/src/test/java/com/android/tools/r8/TestRuntime.java
+++ b/src/test/java/com/android/tools/r8/TestRuntime.java
@@ -29,7 +29,7 @@
     JDK9("jdk9", 53),
     JDK10("jdk10", 54),
     JDK11("jdk11", 55),
-    JDK16("jdk16", 60),
+    JDK17("jdk17", 61),
     ;
 
     private final String name;
@@ -70,13 +70,13 @@
   private static final Path JDK9_PATH =
       Paths.get(ToolHelper.THIRD_PARTY_DIR, "openjdk", "openjdk-9.0.4");
   private static final Path JDK11_PATH = Paths.get(ToolHelper.THIRD_PARTY_DIR, "openjdk", "jdk-11");
-  private static final Path JDK16_PATH = Paths.get(ToolHelper.THIRD_PARTY_DIR, "openjdk", "jdk-16");
+  private static final Path JDK17_PATH = Paths.get(ToolHelper.THIRD_PARTY_DIR, "openjdk", "jdk-17");
   private static final Map<CfVm, Path> jdkPaths =
       ImmutableMap.of(
           CfVm.JDK8, JDK8_PATH,
           CfVm.JDK9, JDK9_PATH,
           CfVm.JDK11, JDK11_PATH,
-          CfVm.JDK16, JDK16_PATH);
+          CfVm.JDK17, JDK17_PATH);
 
   public static CfRuntime getCheckedInJdk(CfVm vm) {
     if (vm == CfVm.JDK8) {
@@ -121,9 +121,9 @@
     return new CfRuntime(CfVm.JDK11, getCheckedInJdkHome(CfVm.JDK11));
   }
 
-  // TODO(b/169692487): Add this to 'getCheckedInCfRuntimes' when we start having support for JDK16.
-  public static CfRuntime getCheckedInJdk16() {
-    return new CfRuntime(CfVm.JDK16, getCheckedInJdkHome(CfVm.JDK16));
+  // TODO(b/169692487): Add this to 'getCheckedInCfRuntimes' when we start having support for JDK17.
+  public static CfRuntime getCheckedInJdk17() {
+    return new CfRuntime(CfVm.JDK17, getCheckedInJdkHome(CfVm.JDK17));
   }
 
   public static List<CfRuntime> getCheckedInCfRuntimes() {
diff --git a/src/test/java/com/android/tools/r8/desugar/records/EmptyRecordTest.java b/src/test/java/com/android/tools/r8/desugar/records/EmptyRecordTest.java
index 389744e..3b5d66f 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/EmptyRecordTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/EmptyRecordTest.java
@@ -33,10 +33,10 @@
 
   @Parameterized.Parameters(name = "{0}")
   public static List<Object[]> data() {
-    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk16).
+    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk17).
     return buildParameters(
         getTestParameters()
-            .withCustomRuntime(CfRuntime.getCheckedInJdk16())
+            .withCustomRuntime(CfRuntime.getCheckedInJdk17())
             .withDexRuntimes()
             .withAllApiLevelsAlsoForCf()
             .build());
@@ -47,7 +47,6 @@
     if (parameters.isCfRuntime()) {
       testForJvm()
           .addProgramClassFileData(PROGRAM_DATA)
-          .enablePreview()
           .run(parameters.getRuntime(), MAIN_TYPE)
           .assertSuccessWithOutput(EXPECTED_RESULT);
     }
diff --git a/src/test/java/com/android/tools/r8/desugar/records/InvalidRecordAttributeTest.java b/src/test/java/com/android/tools/r8/desugar/records/InvalidRecordAttributeTest.java
deleted file mode 100644
index 7064af6..0000000
--- a/src/test/java/com/android/tools/r8/desugar/records/InvalidRecordAttributeTest.java
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright (c) 2021, 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.
-
-package com.android.tools.r8.desugar.records;
-
-import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.junit.Assert.assertThrows;
-
-import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestDiagnosticMessages;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestRuntime.CfRuntime;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import java.util.List;
-import org.junit.Assume;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/** Remove this test when Records are supported by default. */
-@RunWith(Parameterized.class)
-public class InvalidRecordAttributeTest extends TestBase {
-
-  private final TestParameters parameters;
-  private final Backend backend;
-
-  private static final String EMPTY_RECORD = "EmptyRecord";
-  private static final byte[][] EMPTY_RECORD_PROGRAM_DATA =
-      RecordTestUtils.getProgramData(EMPTY_RECORD);
-  private static final String SIMPLE_RECORD = "SimpleRecord";
-  private static final byte[][] SIMPLE_RECORD_PROGRAM_DATA =
-      RecordTestUtils.getProgramData(SIMPLE_RECORD);
-
-  @Parameters(name = "{0} back: {1}")
-  public static List<Object[]> data() {
-    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk16).
-    return buildParameters(
-        getTestParameters().withCustomRuntime(CfRuntime.getCheckedInJdk16()).build(),
-        Backend.values());
-  }
-
-  public InvalidRecordAttributeTest(TestParameters parameters, Backend backend) {
-    this.parameters = parameters;
-    this.backend = backend;
-  }
-
-  @Test
-  public void testD8EmptyRecord() throws Exception {
-    Assume.assumeTrue(backend.isDex());
-    assertThrows(
-        CompilationFailedException.class,
-        () -> {
-          testForD8(backend)
-              .addProgramClassFileData(EMPTY_RECORD_PROGRAM_DATA)
-              .setMinApi(AndroidApiLevel.B)
-              .compileWithExpectedDiagnostics(
-                  InvalidRecordAttributeTest::assertUnsupportedRecordError);
-        });
-  }
-
-  @Test
-  public void testD8SimpleRecord() throws Exception {
-    Assume.assumeTrue(backend.isDex());
-    assertThrows(
-        CompilationFailedException.class,
-        () -> {
-          testForD8(backend)
-              .addProgramClassFileData(RecordTestUtils.getProgramData(SIMPLE_RECORD))
-              .setMinApi(AndroidApiLevel.B)
-              .compileWithExpectedDiagnostics(
-                  InvalidRecordAttributeTest::assertUnsupportedRecordError);
-        });
-  }
-
-  @Test
-  public void testR8EmptyRecord() throws Exception {
-    assertThrows(
-        CompilationFailedException.class,
-        () -> {
-          testForR8(backend)
-              .addProgramClassFileData(EMPTY_RECORD_PROGRAM_DATA)
-              .setMinApi(AndroidApiLevel.B)
-              .addKeepMainRule(RecordTestUtils.getMainType(EMPTY_RECORD))
-              .compileWithExpectedDiagnostics(
-                  InvalidRecordAttributeTest::assertUnsupportedRecordError);
-        });
-  }
-
-  @Test
-  public void testR8SimpleRecord() throws Exception {
-    assertThrows(
-        CompilationFailedException.class,
-        () -> {
-          testForR8(backend)
-              .addProgramClassFileData(SIMPLE_RECORD_PROGRAM_DATA)
-              .setMinApi(AndroidApiLevel.B)
-              .addKeepMainRule(RecordTestUtils.getMainType(SIMPLE_RECORD))
-              .compileWithExpectedDiagnostics(
-                  InvalidRecordAttributeTest::assertUnsupportedRecordError);
-        });
-  }
-
-  private static void assertUnsupportedRecordError(TestDiagnosticMessages diagnostics) {
-    diagnostics.assertErrorThatMatches(
-        diagnosticMessage(containsString("Records are not supported")));
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/desugar/records/RecordInstanceOfTest.java b/src/test/java/com/android/tools/r8/desugar/records/RecordInstanceOfTest.java
index 08b0e85..08d659b 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/RecordInstanceOfTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/RecordInstanceOfTest.java
@@ -33,10 +33,10 @@
 
   @Parameterized.Parameters(name = "{0}")
   public static List<Object[]> data() {
-    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk15).
+    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk17).
     return buildParameters(
         getTestParameters()
-            .withCustomRuntime(CfRuntime.getCheckedInJdk16())
+            .withCustomRuntime(CfRuntime.getCheckedInJdk17())
             .withDexRuntimes()
             .withAllApiLevelsAlsoForCf()
             .build());
@@ -47,7 +47,6 @@
     if (parameters.isCfRuntime()) {
       testForJvm()
           .addProgramClassFileData(PROGRAM_DATA)
-          .enablePreview()
           .run(parameters.getRuntime(), MAIN_TYPE)
           .assertSuccessWithOutput(EXPECTED_RESULT);
     }
diff --git a/src/test/java/com/android/tools/r8/desugar/records/RecordInvokeCustomTest.java b/src/test/java/com/android/tools/r8/desugar/records/RecordInvokeCustomTest.java
index 9bf3327..408259a 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/RecordInvokeCustomTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/RecordInvokeCustomTest.java
@@ -46,10 +46,10 @@
 
   @Parameterized.Parameters(name = "{0}")
   public static List<Object[]> data() {
-    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk16).
+    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk17).
     return buildParameters(
         getTestParameters()
-            .withCustomRuntime(CfRuntime.getCheckedInJdk16())
+            .withCustomRuntime(CfRuntime.getCheckedInJdk17())
             .withDexRuntimes()
             .withAllApiLevelsAlsoForCf()
             .build());
@@ -60,7 +60,6 @@
     if (parameters.isCfRuntime()) {
       testForJvm()
           .addProgramClassFileData(PROGRAM_DATA)
-          .enablePreview()
           .run(parameters.getRuntime(), MAIN_TYPE)
           .assertSuccessWithOutput(EXPECTED_RESULT);
     }
diff --git a/src/test/java/com/android/tools/r8/desugar/records/RecordMergeTest.java b/src/test/java/com/android/tools/r8/desugar/records/RecordMergeTest.java
index 240e128..17aaeac 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/RecordMergeTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/RecordMergeTest.java
@@ -40,10 +40,10 @@
 
   @Parameterized.Parameters(name = "{0}")
   public static List<Object[]> data() {
-    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk16).
+    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk17).
     return buildParameters(
         getTestParameters()
-            .withCustomRuntime(CfRuntime.getCheckedInJdk16())
+            .withCustomRuntime(CfRuntime.getCheckedInJdk17())
             .withDexRuntimes()
             .withAllApiLevelsAlsoForCf()
             .build());
diff --git a/src/test/java/com/android/tools/r8/desugar/records/RecordReflectionTest.java b/src/test/java/com/android/tools/r8/desugar/records/RecordReflectionTest.java
index 9663f43..e2ea7e2 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/RecordReflectionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/RecordReflectionTest.java
@@ -43,16 +43,15 @@
 
   @Parameterized.Parameters(name = "{0}")
   public static List<Object[]> data() {
-    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk16).
+    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk17).
     return buildParameters(
-        getTestParameters().withCustomRuntime(CfRuntime.getCheckedInJdk16()).build());
+        getTestParameters().withCustomRuntime(CfRuntime.getCheckedInJdk17()).build());
   }
 
   @Test
   public void testJvm() throws Exception {
     testForJvm()
         .addProgramClassFileData(PROGRAM_DATA)
-        .enablePreview()
         .run(parameters.getRuntime(), MAIN_TYPE)
         .assertSuccessWithOutput(EXPECTED_RESULT);
   }
diff --git a/src/test/java/com/android/tools/r8/desugar/records/RecordTestUtils.java b/src/test/java/com/android/tools/r8/desugar/records/RecordTestUtils.java
index 86e30a6..b6b2689 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/RecordTestUtils.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/RecordTestUtils.java
@@ -31,7 +31,7 @@
  */
 public class RecordTestUtils {
 
-  private static final String EXAMPLE_FOLDER = "examplesJava16";
+  private static final String EXAMPLE_FOLDER = "examplesJava17";
   private static final String RECORD_FOLDER = "records";
 
   public static Path jar() {
diff --git a/src/test/java/com/android/tools/r8/desugar/records/RecordWithMembersTest.java b/src/test/java/com/android/tools/r8/desugar/records/RecordWithMembersTest.java
index 36b2377..145ee07 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/RecordWithMembersTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/RecordWithMembersTest.java
@@ -35,10 +35,10 @@
 
   @Parameterized.Parameters(name = "{0}")
   public static List<Object[]> data() {
-    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk16).
+    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk17).
     return buildParameters(
         getTestParameters()
-            .withCustomRuntime(CfRuntime.getCheckedInJdk16())
+            .withCustomRuntime(CfRuntime.getCheckedInJdk17())
             .withDexRuntimes()
             .withAllApiLevelsAlsoForCf()
             .build());
@@ -49,7 +49,6 @@
     if (parameters.isCfRuntime()) {
       testForJvm()
           .addProgramClassFileData(PROGRAM_DATA)
-          .enablePreview()
           .run(parameters.getRuntime(), MAIN_TYPE)
           .assertSuccessWithOutput(EXPECTED_RESULT);
     }
diff --git a/src/test/java/com/android/tools/r8/desugar/records/SimpleRecordTest.java b/src/test/java/com/android/tools/r8/desugar/records/SimpleRecordTest.java
index 08c9468..2fe5210 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/SimpleRecordTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/SimpleRecordTest.java
@@ -34,10 +34,10 @@
 
   @Parameterized.Parameters(name = "{0}")
   public static List<Object[]> data() {
-    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk16).
+    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk17).
     return buildParameters(
         getTestParameters()
-            .withCustomRuntime(CfRuntime.getCheckedInJdk16())
+            .withCustomRuntime(CfRuntime.getCheckedInJdk17())
             .withDexRuntimes()
             .withAllApiLevelsAlsoForCf()
             .build());
@@ -48,7 +48,6 @@
     if (parameters.isCfRuntime()) {
       testForJvm()
           .addProgramClassFileData(PROGRAM_DATA)
-          .enablePreview()
           .run(parameters.getRuntime(), MAIN_TYPE)
           .assertSuccessWithOutput(EXPECTED_RESULT);
     }
diff --git a/src/test/java/com/android/tools/r8/desugar/sealed/SealedAttributeTest.java b/src/test/java/com/android/tools/r8/desugar/sealed/SealedAttributeTest.java
index d311db8..710f6f5 100644
--- a/src/test/java/com/android/tools/r8/desugar/sealed/SealedAttributeTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/sealed/SealedAttributeTest.java
@@ -13,7 +13,7 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime;
-import com.android.tools.r8.examples.jdk16.Sealed;
+import com.android.tools.r8.examples.jdk17.Sealed;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import java.util.List;
 import org.junit.Test;
@@ -28,9 +28,9 @@
 
   @Parameters(name = "{0}")
   public static List<Object[]> data() {
-    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk16).
+    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk17).
     return buildParameters(
-        getTestParameters().withCustomRuntime(TestRuntime.getCheckedInJdk16()).build(),
+        getTestParameters().withCustomRuntime(TestRuntime.getCheckedInJdk17()).build(),
         Backend.values());
   }
 
@@ -43,8 +43,7 @@
     assumeTrue(backend == Backend.CF);
     testForJvm()
         .addRunClasspathFiles(Sealed.jar())
-        .enablePreview()
-        .run(TestRuntime.getCheckedInJdk16(), Sealed.Main.typeName())
+        .run(TestRuntime.getCheckedInJdk17(), Sealed.Main.typeName())
         .assertSuccessWithOutputLines("R8 compiler", "D8 compiler");
   }
 
diff --git a/src/test/java/com/android/tools/r8/examples/jdk16/PatternMatchingForInstenceof.java b/src/test/java/com/android/tools/r8/examples/jdk17/PatternMatchingForInstanceof.java
similarity index 78%
rename from src/test/java/com/android/tools/r8/examples/jdk16/PatternMatchingForInstenceof.java
rename to src/test/java/com/android/tools/r8/examples/jdk17/PatternMatchingForInstanceof.java
index 0cc4846..ec5f4cd 100644
--- a/src/test/java/com/android/tools/r8/examples/jdk16/PatternMatchingForInstenceof.java
+++ b/src/test/java/com/android/tools/r8/examples/jdk17/PatternMatchingForInstanceof.java
@@ -2,14 +2,14 @@
 // 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.
 
-package com.android.tools.r8.examples.jdk16;
+package com.android.tools.r8.examples.jdk17;
 
 import com.android.tools.r8.examples.JavaExampleClassProxy;
 import java.nio.file.Path;
 
-public class PatternMatchingForInstenceof {
+public class PatternMatchingForInstanceof {
 
-  private static final String EXAMPLE_FILE = "examplesJava16/pattern_matching_for_instanceof";
+  private static final String EXAMPLE_FILE = "examplesJava17/pattern_matching_for_instanceof";
 
   public static final JavaExampleClassProxy Main =
       new JavaExampleClassProxy(EXAMPLE_FILE, "pattern_matching_for_instanceof/Main");
diff --git a/src/test/java/com/android/tools/r8/examples/jdk16/Records.java b/src/test/java/com/android/tools/r8/examples/jdk17/Records.java
similarity index 85%
rename from src/test/java/com/android/tools/r8/examples/jdk16/Records.java
rename to src/test/java/com/android/tools/r8/examples/jdk17/Records.java
index a8677b8..aa4581e 100644
--- a/src/test/java/com/android/tools/r8/examples/jdk16/Records.java
+++ b/src/test/java/com/android/tools/r8/examples/jdk17/Records.java
@@ -2,14 +2,14 @@
 // 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.
 
-package com.android.tools.r8.examples.jdk16;
+package com.android.tools.r8.examples.jdk17;
 
 import com.android.tools.r8.examples.JavaExampleClassProxy;
 import java.nio.file.Path;
 
 public class Records {
 
-  private static final String EXAMPLE_FILE = "examplesJava16/records";
+  private static final String EXAMPLE_FILE = "examplesJava17/records";
 
   public static final JavaExampleClassProxy Main =
       new JavaExampleClassProxy(EXAMPLE_FILE, "records/Main");
diff --git a/src/test/java/com/android/tools/r8/examples/jdk16/Sealed.java b/src/test/java/com/android/tools/r8/examples/jdk17/Sealed.java
similarity index 89%
rename from src/test/java/com/android/tools/r8/examples/jdk16/Sealed.java
rename to src/test/java/com/android/tools/r8/examples/jdk17/Sealed.java
index c995d13..8858316 100644
--- a/src/test/java/com/android/tools/r8/examples/jdk16/Sealed.java
+++ b/src/test/java/com/android/tools/r8/examples/jdk17/Sealed.java
@@ -2,14 +2,14 @@
 // 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.
 
-package com.android.tools.r8.examples.jdk16;
+package com.android.tools.r8.examples.jdk17;
 
 import com.android.tools.r8.examples.JavaExampleClassProxy;
 import java.nio.file.Path;
 
 public class Sealed {
 
-  private static final String EXAMPLE_FILE = "examplesJava16/sealed";
+  private static final String EXAMPLE_FILE = "examplesJava17/sealed";
 
   public static final JavaExampleClassProxy Compiler =
       new JavaExampleClassProxy(EXAMPLE_FILE, "sealed/Compiler");
diff --git a/src/test/java/com/android/tools/r8/java_language/pattern_matching_for_instenceof/PattternMatchingForInstanceOfTest.java b/src/test/java/com/android/tools/r8/java_language/pattern_matching_for_instenceof/PattternMatchingForInstanceOfTest.java
index 345f198..95cf5b2 100644
--- a/src/test/java/com/android/tools/r8/java_language/pattern_matching_for_instenceof/PattternMatchingForInstanceOfTest.java
+++ b/src/test/java/com/android/tools/r8/java_language/pattern_matching_for_instenceof/PattternMatchingForInstanceOfTest.java
@@ -8,7 +8,7 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfRuntime;
-import com.android.tools.r8.examples.jdk16.PatternMatchingForInstenceof;
+import com.android.tools.r8.examples.jdk17.PatternMatchingForInstanceof;
 import com.android.tools.r8.utils.InternalOptions.TestingOptions;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
@@ -26,15 +26,15 @@
 
   private static List<String> EXPECTED = ImmutableList.of("Hello, world!");
 
-  private static final Path JAR = PatternMatchingForInstenceof.jar();
-  private static final String MAIN = PatternMatchingForInstenceof.Main.typeName();
+  private static final Path JAR = PatternMatchingForInstanceof.jar();
+  private static final String MAIN = PatternMatchingForInstanceof.Main.typeName();
 
   @Parameters(name = "{0}")
   public static List<Object[]> data() {
-    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk16).
+    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk17).
     return buildParameters(
         getTestParameters()
-            .withCustomRuntime(CfRuntime.getCheckedInJdk16())
+            .withCustomRuntime(CfRuntime.getCheckedInJdk17())
             .withDexRuntimes()
             .withAllApiLevelsAlsoForCf()
             .build());
@@ -45,7 +45,6 @@
     if (parameters.isCfRuntime()) {
       testForJvm()
           .addRunClasspathFiles(JAR)
-          .enablePreview()
           .run(parameters.getRuntime(), MAIN)
           .assertSuccessWithOutputLines(EXPECTED);
     }
@@ -71,7 +70,6 @@
     } else {
       testForJvm()
           .addRunClasspathFiles(builder.compile().writeToZip())
-          .enablePreview()
           .run(parameters.getRuntime(), MAIN)
           .assertSuccessWithOutputLines(EXPECTED);
     }
diff --git a/third_party/openjdk/jdk-17/linux.tar.gz.sha1 b/third_party/openjdk/jdk-17/linux.tar.gz.sha1
new file mode 100644
index 0000000..27451d3
--- /dev/null
+++ b/third_party/openjdk/jdk-17/linux.tar.gz.sha1
@@ -0,0 +1 @@
+fa768e38f9c28e401174cecdd4e326b5fae120e1
\ No newline at end of file
diff --git a/third_party/openjdk/jdk-17/osx.tar.gz.sha1 b/third_party/openjdk/jdk-17/osx.tar.gz.sha1
new file mode 100644
index 0000000..ff2288f
--- /dev/null
+++ b/third_party/openjdk/jdk-17/osx.tar.gz.sha1
@@ -0,0 +1 @@
+7c62e0a6a3168e138f4bad06439650a9e0869333
\ No newline at end of file
diff --git a/third_party/openjdk/jdk-17/windows.tar.gz.sha1 b/third_party/openjdk/jdk-17/windows.tar.gz.sha1
new file mode 100644
index 0000000..0a02a42
--- /dev/null
+++ b/third_party/openjdk/jdk-17/windows.tar.gz.sha1
@@ -0,0 +1 @@
+07d750b353ebd4f5ef9ec99c916e50b33f47a8a8
\ No newline at end of file