changeset 59879:ce082993c9d2

Merge
author jwilhelm
date Mon, 22 Jun 2020 18:23:49 +0200
parents 05558bb80462 8fc8245d08f9
children be8f84478783 bb8a04e533c8
files src/hotspot/share/classfile/javaClasses.cpp src/hotspot/share/classfile/vmSymbols.hpp src/hotspot/share/runtime/globals.hpp test/jdk/java/lang/invoke/defineHiddenClass/UnreflectTest.java test/jdk/java/lang/invoke/defineHiddenClass/src/Fields.java
diffstat 82 files changed, 1143 insertions(+), 434 deletions(-) [+]
line wrap: on
line diff
--- a/src/hotspot/share/ci/ciField.cpp	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/hotspot/share/ci/ciField.cpp	Mon Jun 22 18:23:49 2020 +0200
@@ -231,6 +231,9 @@
   // Trust final fields in all boxed classes
   if (holder->is_box_klass())
     return true;
+  // Trust final fields in records
+  if (holder->is_record())
+    return true;
   // Trust final fields in String
   if (holder->name() == ciSymbol::java_lang_String())
     return true;
--- a/src/hotspot/share/ci/ciInstanceKlass.cpp	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/hotspot/share/ci/ciInstanceKlass.cpp	Mon Jun 22 18:23:49 2020 +0200
@@ -64,6 +64,7 @@
   _has_nonstatic_concrete_methods = ik->has_nonstatic_concrete_methods();
   _is_unsafe_anonymous = ik->is_unsafe_anonymous();
   _is_hidden = ik->is_hidden();
+  _is_record = ik->is_record();
   _nonstatic_fields = NULL; // initialized lazily by compute_nonstatic_fields:
   _has_injected_fields = -1;
   _implementor = NULL; // we will fill these lazily
@@ -125,6 +126,7 @@
   _has_injected_fields = -1;
   _is_unsafe_anonymous = false;
   _is_hidden = false;
+  _is_record = false;
   _loader = loader;
   _protection_domain = protection_domain;
   _is_shared = false;
--- a/src/hotspot/share/ci/ciInstanceKlass.hpp	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/hotspot/share/ci/ciInstanceKlass.hpp	Mon Jun 22 18:23:49 2020 +0200
@@ -57,6 +57,7 @@
   bool                   _has_nonstatic_concrete_methods;
   bool                   _is_unsafe_anonymous;
   bool                   _is_hidden;
+  bool                   _is_record;
 
   ciFlags                _flags;
   jint                   _nonstatic_field_size;
@@ -200,6 +201,10 @@
     return _is_hidden;
   }
 
+  bool is_record() const {
+    return _is_record;
+  }
+
   ciInstanceKlass* get_canonical_holder(int offset);
   ciField* get_field_by_offset(int field_offset, bool is_static);
   ciField* get_field_by_name(ciSymbol* name, ciSymbol* signature, bool is_static);
--- a/src/hotspot/share/classfile/javaClasses.cpp	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/hotspot/share/classfile/javaClasses.cpp	Mon Jun 22 18:23:49 2020 +0200
@@ -3141,6 +3141,7 @@
 int java_lang_reflect_Field::_type_offset;
 int java_lang_reflect_Field::_slot_offset;
 int java_lang_reflect_Field::_modifiers_offset;
+int java_lang_reflect_Field::_trusted_final_offset;
 int java_lang_reflect_Field::_signature_offset;
 int java_lang_reflect_Field::_annotations_offset;
 
@@ -3150,6 +3151,7 @@
   macro(_type_offset,      k, vmSymbols::type_name(),      class_signature,  false); \
   macro(_slot_offset,      k, vmSymbols::slot_name(),      int_signature,    false); \
   macro(_modifiers_offset, k, vmSymbols::modifiers_name(), int_signature,    false); \
+  macro(_trusted_final_offset,    k, vmSymbols::trusted_final_name(),    bool_signature,       false); \
   macro(_signature_offset,        k, vmSymbols::signature_name(),        string_signature,     false); \
   macro(_annotations_offset,      k, vmSymbols::annotations_name(),      byte_array_signature, false);
 
@@ -3214,6 +3216,10 @@
   field->int_field_put(_modifiers_offset, value);
 }
 
+void java_lang_reflect_Field::set_trusted_final(oop field) {
+  field->bool_field_put(_trusted_final_offset, true);
+}
+
 void java_lang_reflect_Field::set_signature(oop field, oop value) {
   field->obj_field_put(_signature_offset, value);
 }
--- a/src/hotspot/share/classfile/javaClasses.hpp	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/hotspot/share/classfile/javaClasses.hpp	Mon Jun 22 18:23:49 2020 +0200
@@ -696,6 +696,7 @@
   static int _type_offset;
   static int _slot_offset;
   static int _modifiers_offset;
+  static int _trusted_final_offset;
   static int _signature_offset;
   static int _annotations_offset;
 
@@ -723,6 +724,8 @@
   static int modifiers(oop field);
   static void set_modifiers(oop field, int value);
 
+  static void set_trusted_final(oop field);
+
   static void set_signature(oop constructor, oop value);
   static void set_annotations(oop constructor, oop value);
   static void set_parameter_annotations(oop method, oop value);
@@ -1121,6 +1124,7 @@
     MN_IS_FIELD              = 0x00040000, // field
     MN_IS_TYPE               = 0x00080000, // nested type
     MN_CALLER_SENSITIVE      = 0x00100000, // @CallerSensitive annotation detected
+    MN_TRUSTED_FINAL         = 0x00200000, // trusted final field
     MN_REFERENCE_KIND_SHIFT  = 24, // refKind
     MN_REFERENCE_KIND_MASK   = 0x0F000000 >> MN_REFERENCE_KIND_SHIFT,
     // The SEARCH_* bits are not for MN.flags but for the matchFlags argument of MHN.getMembers:
--- a/src/hotspot/share/classfile/vmSymbols.hpp	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/hotspot/share/classfile/vmSymbols.hpp	Mon Jun 22 18:23:49 2020 +0200
@@ -266,6 +266,7 @@
   template(returnType_name,                           "returnType")                               \
   template(signature_name,                            "signature")                                \
   template(slot_name,                                 "slot")                                     \
+  template(trusted_final_name,                        "trustedFinal")                             \
                                                                                                   \
   /* Support for annotations (JDK 1.5 and above) */                                               \
                                                                                                   \
--- a/src/hotspot/share/opto/convertnode.cpp	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/hotspot/share/opto/convertnode.cpp	Mon Jun 22 18:23:49 2020 +0200
@@ -334,6 +334,13 @@
   Node* z = in(1);
   int op = z->Opcode();
   if (op == Op_AddI || op == Op_SubI) {
+    if (!can_reshape) {
+      // Postpone this optimization to after parsing because with deep AddNode
+      // chains a large amount of dead ConvI2L nodes might be created that are
+      // not removed during parsing. As a result, we might hit the node limit.
+      phase->record_for_igvn(this);
+      return this_changed;
+    }
     Node* x = z->in(1);
     Node* y = z->in(2);
     assert (x != z && y != z, "dead loop in ConvI2LNode::Ideal");
--- a/src/hotspot/share/prims/methodHandles.cpp	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/hotspot/share/prims/methodHandles.cpp	Mon Jun 22 18:23:49 2020 +0200
@@ -126,6 +126,7 @@
   IS_FIELD             = java_lang_invoke_MemberName::MN_IS_FIELD,
   IS_TYPE              = java_lang_invoke_MemberName::MN_IS_TYPE,
   CALLER_SENSITIVE     = java_lang_invoke_MemberName::MN_CALLER_SENSITIVE,
+  TRUSTED_FINAL        = java_lang_invoke_MemberName::MN_TRUSTED_FINAL,
   REFERENCE_KIND_SHIFT = java_lang_invoke_MemberName::MN_REFERENCE_KIND_SHIFT,
   REFERENCE_KIND_MASK  = java_lang_invoke_MemberName::MN_REFERENCE_KIND_MASK,
   SEARCH_SUPERCLASSES  = java_lang_invoke_MemberName::MN_SEARCH_SUPERCLASSES,
@@ -339,8 +340,10 @@
 }
 
 oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) {
+  InstanceKlass* ik = fd.field_holder();
   int flags = (jushort)( fd.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS );
   flags |= IS_FIELD | ((fd.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT);
+  if (fd.is_trusted_final()) flags |= TRUSTED_FINAL;
   if (is_setter)  flags += ((JVM_REF_putField - JVM_REF_getField) << REFERENCE_KIND_SHIFT);
   int vmindex        = fd.offset();  // determines the field uniquely when combined with static bit
 
@@ -348,7 +351,7 @@
   java_lang_invoke_MemberName::set_flags  (mname_oop, flags);
   java_lang_invoke_MemberName::set_method (mname_oop, NULL);
   java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex);
-  java_lang_invoke_MemberName::set_clazz  (mname_oop, fd.field_holder()->java_mirror());
+  java_lang_invoke_MemberName::set_clazz  (mname_oop, ik->java_mirror());
 
   oop type = field_signature_type_or_null(fd.signature());
   oop name = field_name_or_null(fd.name());
@@ -1107,6 +1110,7 @@
     template(java_lang_invoke_MemberName,MN_IS_FIELD) \
     template(java_lang_invoke_MemberName,MN_IS_TYPE) \
     template(java_lang_invoke_MemberName,MN_CALLER_SENSITIVE) \
+    template(java_lang_invoke_MemberName,MN_TRUSTED_FINAL) \
     template(java_lang_invoke_MemberName,MN_SEARCH_SUPERCLASSES) \
     template(java_lang_invoke_MemberName,MN_SEARCH_INTERFACES) \
     template(java_lang_invoke_MemberName,MN_REFERENCE_KIND_SHIFT) \
--- a/src/hotspot/share/runtime/fieldDescriptor.cpp	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/hotspot/share/runtime/fieldDescriptor.cpp	Mon Jun 22 18:23:49 2020 +0200
@@ -58,6 +58,11 @@
   return NULL;
 }
 
+bool fieldDescriptor::is_trusted_final() const {
+  InstanceKlass* ik = field_holder();
+  return is_final() && (is_static() || ik->is_hidden() || ik->is_record());
+}
+
 AnnotationArray* fieldDescriptor::annotations() const {
   InstanceKlass* ik = field_holder();
   Array<AnnotationArray*>* md = ik->fields_annotations();
--- a/src/hotspot/share/runtime/fieldDescriptor.hpp	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/hotspot/share/runtime/fieldDescriptor.hpp	Mon Jun 22 18:23:49 2020 +0200
@@ -102,6 +102,8 @@
   bool has_initialized_final_update() const { return access_flags().has_field_initialized_final_update(); }
   bool has_generic_signature()    const    { return access_flags().field_has_generic_signature(); }
 
+  bool is_trusted_final()         const;
+
   inline void set_is_field_access_watched(const bool value);
   inline void set_is_field_modification_watched(const bool value);
   inline void set_has_initialized_final_update(const bool value);
--- a/src/hotspot/share/runtime/globals.hpp	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/hotspot/share/runtime/globals.hpp	Mon Jun 22 18:23:49 2020 +0200
@@ -614,7 +614,7 @@
   product(bool, OmitStackTraceInFastThrow, true,                            \
           "Omit backtraces for some 'hot' exceptions in optimized code")    \
                                                                             \
-  manageable(bool, ShowCodeDetailsInExceptionMessages, false,               \
+  manageable(bool, ShowCodeDetailsInExceptionMessages, true,                \
           "Show exception messages from RuntimeExceptions that contain "    \
           "snippets of the failing code. Disable this to improve privacy.") \
                                                                             \
--- a/src/hotspot/share/runtime/reflection.cpp	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/hotspot/share/runtime/reflection.cpp	Mon Jun 22 18:23:49 2020 +0200
@@ -897,6 +897,9 @@
   java_lang_reflect_Field::set_slot(rh(), fd->index());
   java_lang_reflect_Field::set_name(rh(), name());
   java_lang_reflect_Field::set_type(rh(), type());
+  if (fd->is_trusted_final()) {
+    java_lang_reflect_Field::set_trusted_final(rh());
+  }
   // Note the ACC_ANNOTATION bit, which is a per-class access flag, is never set here.
   java_lang_reflect_Field::set_modifiers(rh(), fd->access_flags().as_int() & JVM_RECOGNIZED_FIELD_MODIFIERS);
   java_lang_reflect_Field::set_override(rh(), false);
--- a/src/java.base/share/classes/java/io/PipedWriter.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/java.base/share/classes/java/io/PipedWriter.java	Mon Jun 22 18:23:49 2020 +0200
@@ -112,7 +112,7 @@
      * Implements the {@code write} method of {@code Writer}.
      *
      * @param   c   the {@code char} to be written.
-     * @throw   IOException  if the pipe is
+     * @throws  IOException  if the pipe is
      *          <a href=PipedOutputStream.html#BROKEN> {@code broken}</a>,
      *          {@link #connect(java.io.PipedReader) unconnected}, closed
      *          or an I/O error occurs.
--- a/src/java.base/share/classes/java/io/SequenceInputStream.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/java.base/share/classes/java/io/SequenceInputStream.java	Mon Jun 22 18:23:49 2020 +0200
@@ -121,7 +121,7 @@
      *           skipped over) from the current underlying input stream
      *           without blocking or {@code 0} if this input stream
      *           has been closed by invoking its {@link #close()} method
-     * @throw    IOException  if an I/O error occurs.
+     * @throws   IOException  if an I/O error occurs.
      *
      * @since    1.1
      */
--- a/src/java.base/share/classes/java/lang/doc-files/threadPrimitiveDeprecation.html	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/java.base/share/classes/java/lang/doc-files/threadPrimitiveDeprecation.html	Mon Jun 22 18:23:49 2020 +0200
@@ -282,7 +282,7 @@
         }
     }
 </pre>
-<hr size="3" noshade="noshade" />
+<hr>
 <h2>Can I combine the two techniques to produce a thread that may
 be safely "stopped" or "suspended"?</h2>
 Yes, it's reasonably straightforward. The one subtlety is that the
@@ -324,6 +324,5 @@
 described above, it needn't call <code>notify</code> as well, but it
 still must be synchronized. This ensures that the target thread
 won't miss an interrupt due to a race condition.
-<p><!-- Body text ends here --></p>
 </body>
 </html>
--- a/src/java.base/share/classes/java/lang/invoke/MemberName.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/java.base/share/classes/java/lang/invoke/MemberName.java	Mon Jun 22 18:23:49 2020 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2020, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -480,7 +480,8 @@
             IS_CONSTRUCTOR   = MN_IS_CONSTRUCTOR,   // constructor
             IS_FIELD         = MN_IS_FIELD,         // field
             IS_TYPE          = MN_IS_TYPE,          // nested type
-            CALLER_SENSITIVE = MN_CALLER_SENSITIVE; // @CallerSensitive annotation detected
+            CALLER_SENSITIVE = MN_CALLER_SENSITIVE, // @CallerSensitive annotation detected
+            TRUSTED_FINAL    = MN_TRUSTED_FINAL;    // trusted final field
 
     static final int ALL_ACCESS = Modifier.PUBLIC | Modifier.PRIVATE | Modifier.PROTECTED;
     static final int ALL_KINDS = IS_METHOD | IS_CONSTRUCTOR | IS_FIELD | IS_TYPE;
@@ -520,6 +521,8 @@
     public boolean isCallerSensitive() {
         return testAllFlags(CALLER_SENSITIVE);
     }
+    /** Query whether this member is a trusted final field. */
+    public boolean isTrustedFinalField() { return testAllFlags(TRUSTED_FINAL|IS_FIELD); }
 
     /** Utility method to query whether this member is accessible from a given lookup class. */
     public boolean isAccessibleFrom(Class<?> lookupClass) {
--- a/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java	Mon Jun 22 18:23:49 2020 +0200
@@ -118,6 +118,7 @@
             MN_IS_FIELD            = 0x00040000, // field
             MN_IS_TYPE             = 0x00080000, // nested type
             MN_CALLER_SENSITIVE    = 0x00100000, // @CallerSensitive annotation detected
+            MN_TRUSTED_FINAL       = 0x00200000, // trusted final field
             MN_REFERENCE_KIND_SHIFT = 24, // refKind
             MN_REFERENCE_KIND_MASK = 0x0F000000 >> MN_REFERENCE_KIND_SHIFT,
             // The SEARCH_* bits are not for MN.flags but for the matchFlags argument of MHN.getMembers:
--- a/src/java.base/share/classes/java/lang/invoke/MethodHandles.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/java.base/share/classes/java/lang/invoke/MethodHandles.java	Mon Jun 22 18:23:49 2020 +0200
@@ -3273,10 +3273,10 @@
         private MethodHandle unreflectField(Field f, boolean isSetter) throws IllegalAccessException {
             MemberName field = new MemberName(f, isSetter);
             if (isSetter && field.isFinal()) {
-                if (field.isStatic()) {
-                    throw field.makeAccessException("static final field has no write access", this);
-                } else if (field.getDeclaringClass().isHidden()){
-                    throw field.makeAccessException("final field in a hidden class has no write access", this);
+                if (field.isTrustedFinalField()) {
+                    String msg = field.isStatic() ? "static final field has no write access"
+                                                  : "final field has no write access";
+                    throw field.makeAccessException(msg, this);
                 }
             }
             assert(isSetter
@@ -3839,7 +3839,7 @@
                 refc = lookupClass();
             }
             return VarHandles.makeFieldHandle(getField, refc, getField.getFieldType(),
-                                             this.allowedModes == TRUSTED && !getField.getDeclaringClass().isHidden());
+                                              this.allowedModes == TRUSTED && !getField.isTrustedFinalField());
         }
         /** Check access and get the requested constructor. */
         private MethodHandle getDirectConstructor(Class<?> refc, MemberName ctor) throws IllegalAccessException {
--- a/src/java.base/share/classes/java/lang/reflect/AccessibleObject.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/java.base/share/classes/java/lang/reflect/AccessibleObject.java	Mon Jun 22 18:23:49 2020 +0200
@@ -177,10 +177,16 @@
      * to the caller's module. </p>
      *
      * <p> This method cannot be used to enable {@linkplain Field#set <em>write</em>}
-     * access to a final field declared in a {@linkplain Class#isHidden() hidden class},
-     * since such fields are not modifiable.  The {@code accessible} flag when
-     * {@code true} suppresses Java language access control checks to only
-     * enable {@linkplain Field#get <em>read</em>} access to such fields.
+     * access to a <em>non-modifiable</em> final field.  The following fields
+     * are non-modifiable:
+     * <ul>
+     * <li>static final fields declared in any class or interface</li>
+     * <li>final fields declared in a {@linkplain Class#isHidden() hidden class}</li>
+     * <li>final fields declared in a {@linkplain Class#isRecord() record}</li>
+     * </ul>
+     * <p> The {@code accessible} flag when {@code true} suppresses Java language access
+     * control checks to only enable {@linkplain Field#get <em>read</em>} access to
+     * these non-modifiable final fields.
      *
      * <p> If there is a security manager, its
      * {@code checkPermission} method is first called with a
--- a/src/java.base/share/classes/java/lang/reflect/Field.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/java.base/share/classes/java/lang/reflect/Field.java	Mon Jun 22 18:23:49 2020 +0200
@@ -72,6 +72,7 @@
     private String              name;
     private Class<?>            type;
     private int                 modifiers;
+    private boolean             trustedFinal;
     // Generics and annotations support
     private transient String    signature;
     // generic info repository; lazily initialized
@@ -119,6 +120,7 @@
           String name,
           Class<?> type,
           int modifiers,
+          boolean trustedFinal,
           int slot,
           String signature,
           byte[] annotations)
@@ -127,6 +129,7 @@
         this.name = name;
         this.type = type;
         this.modifiers = modifiers;
+        this.trustedFinal = trustedFinal;
         this.slot = slot;
         this.signature = signature;
         this.annotations = annotations;
@@ -148,7 +151,7 @@
         if (this.root != null)
             throw new IllegalArgumentException("Can not copy a non-root Field");
 
-        Field res = new Field(clazz, name, type, modifiers, slot, signature, annotations);
+        Field res = new Field(clazz, name, type, modifiers, trustedFinal, slot, signature, annotations);
         res.root = this;
         // Might as well eagerly propagate this if already present
         res.fieldAccessor = fieldAccessor;
@@ -728,7 +731,9 @@
      *     this {@code Field} object;</li>
      * <li>the field is non-static; and</li>
      * <li>the field's declaring class is not a {@linkplain Class#isHidden()
-     *     hidden class}.</li>
+     *     hidden class}; and</li>
+     * <li>the field's declaring class is not a {@linkplain Class#isRecord()
+     *     record class}.</li>
      * </ul>
      * If any of the above checks is not met, this method throws an
      * {@code IllegalAccessException}.
@@ -1145,10 +1150,14 @@
     }
 
     @Override
-    Field getRoot() {
+    /* package-private */ Field getRoot() {
         return root;
     }
 
+    /* package-private */ boolean isTrustedFinal() {
+        return trustedFinal;
+    }
+
     /**
      * {@inheritDoc}
      *
--- a/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/java.base/share/classes/java/lang/reflect/ReflectAccess.java	Mon Jun 22 18:23:49 2020 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2020, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -118,6 +118,10 @@
         return (T) obj.getRoot();
     }
 
+    public boolean isTrustedFinalField(Field f) {
+        return f.isTrustedFinal();
+    }
+
     public <T> T newInstance(Constructor<T> ctor, Object[] args, Class<?> caller)
         throws IllegalAccessException, InstantiationException, InvocationTargetException
     {
--- a/src/java.base/share/classes/jdk/internal/access/JavaLangReflectAccess.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/java.base/share/classes/jdk/internal/access/JavaLangReflectAccess.java	Mon Jun 22 18:23:49 2020 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2020, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -96,6 +96,9 @@
     /** Gets the root of the given AccessibleObject object; null if arg is the root */
     public <T extends AccessibleObject> T getRoot(T obj);
 
+    /** Tests if this is a trusted final field */
+    public boolean isTrustedFinalField(Field f);
+
     /** Returns a new instance created by the given constructor with access check */
     public <T> T newInstance(Constructor<T> ctor, Object[] args, Class<?> caller)
         throws IllegalAccessException, InstantiationException, InvocationTargetException;
--- a/src/java.base/share/classes/jdk/internal/reflect/Reflection.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/java.base/share/classes/jdk/internal/reflect/Reflection.java	Mon Jun 22 18:23:49 2020 +0200
@@ -31,6 +31,7 @@
 import java.util.Objects;
 import java.util.Set;
 import jdk.internal.HotSpotIntrinsicCandidate;
+import jdk.internal.access.SharedSecrets;
 import jdk.internal.misc.VM;
 
 /** Common utility routines used by both java.lang and
@@ -336,6 +337,14 @@
         return false;
     }
 
+    /*
+     * Tests if the given Field is a trusted final field and it cannot be
+     * modified reflectively regardless of the value of its accessible flag.
+     */
+    public static boolean isTrustedFinalField(Field field) {
+        return SharedSecrets.getJavaLangReflectAccess().isTrustedFinalField(field);
+    }
+
     /**
      * Returns an IllegalAccessException with an exception message based on
      * the access that is denied.
--- a/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java	Mon Jun 22 18:23:49 2020 +0200
@@ -181,7 +181,9 @@
                 field = root;
             }
         }
-        return UnsafeFieldAccessorFactory.newFieldAccessor(field, override);
+        boolean isFinal = Modifier.isFinal(field.getModifiers());
+        boolean isReadOnly = isFinal && (!override || langReflectAccess.isTrustedFinalField(field));
+        return UnsafeFieldAccessorFactory.newFieldAccessor(field, isReadOnly);
     }
 
     public MethodAccessor newMethodAccessor(Method method) {
--- a/src/java.base/share/classes/jdk/internal/reflect/UnsafeFieldAccessorFactory.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/java.base/share/classes/jdk/internal/reflect/UnsafeFieldAccessorFactory.java	Mon Jun 22 18:23:49 2020 +0200
@@ -29,13 +29,12 @@
 import java.lang.reflect.Modifier;
 
 class UnsafeFieldAccessorFactory {
-    static FieldAccessor newFieldAccessor(Field field, boolean override) {
+    static FieldAccessor newFieldAccessor(Field field, boolean isReadOnly) {
         Class<?> type = field.getType();
         boolean isStatic = Modifier.isStatic(field.getModifiers());
         boolean isFinal = Modifier.isFinal(field.getModifiers());
         boolean isVolatile = Modifier.isVolatile(field.getModifiers());
         boolean isQualified = isFinal || isVolatile;
-        boolean isReadOnly = isFinal && (isStatic || !override || field.getDeclaringClass().isHidden());
         if (isStatic) {
             // This code path does not guarantee that the field's
             // declaring class has been initialized, but it must be
--- a/src/java.management/share/classes/java/lang/management/package.html	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/java.management/share/classes/java/lang/management/package.html	Mon Jun 22 18:23:49 2020 +0200
@@ -234,7 +234,7 @@
 
 <p> The java.lang.management API is thread-safe.
 
-@see {@linkplain javax.management JMX Specification}
+@see javax.management JMX Specification
 
 @author  Mandy Chung
 @since   1.5
--- a/src/java.xml.crypto/share/classes/com/sun/org/slf4j/internal/Logger.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/java.xml.crypto/share/classes/com/sun/org/slf4j/internal/Logger.java	Mon Jun 22 18:23:49 2020 +0200
@@ -103,14 +103,14 @@
         }
     }
 
-    public void log0(Level level, String s, Throwable e) {
+    private void log0(Level level, String s, Throwable e) {
         if (impl.isLoggable(level)) {
             var sf = WALKER.walk(f -> f.skip(2).findFirst()).get();
             impl.logp(Level.FINE, sf.getClassName(), sf.getMethodName(), s, e);
         }
     }
 
-    public void log0(Level level, String s, Object... o) {
+    private void log0(Level level, String s, Object... o) {
         if (impl.isLoggable(level)) {
             var sf = WALKER.walk(f -> f.skip(2).findFirst()).get();
             impl.logp(Level.FINE, sf.getClassName(), sf.getMethodName(),
--- a/src/jdk.compiler/share/classes/com/sun/tools/doclint/Checker.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.compiler/share/classes/com/sun/tools/doclint/Checker.java	Mon Jun 22 18:23:49 2020 +0200
@@ -1168,7 +1168,7 @@
                     return;
             }
         }
-        env.messages.warning(SYNTAX, tree, "dc.empty", tree.getKind().tagName);
+        env.messages.warning(MISSING, tree, "dc.empty", tree.getKind().tagName);
     }
 
     boolean hasNonWhitespace(TextTree tree) {
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java	Mon Jun 22 18:23:49 2020 +0200
@@ -999,7 +999,10 @@
         private JCExpression makeReceiver(VarSymbol rcvr) {
             if (rcvr == null) return null;
             JCExpression rcvrExpr = make.Ident(rcvr);
-            Type rcvrType = tree.ownerAccessible ? tree.sym.enclClass().type : tree.expr.type;
+            boolean protAccess =
+                    isProtectedInSuperClassOfEnclosingClassInOtherPackage(tree.sym, owner);
+            Type rcvrType = tree.ownerAccessible && !protAccess ? tree.sym.enclClass().type
+                                                                : tree.expr.type;
             if (rcvrType == syms.arrayClass.type) {
                 // Map the receiver type to the actually type, not just "array"
                 rcvrType = tree.getQualifierExpression().type;
@@ -2270,11 +2273,6 @@
                               types.erasure(owner.enclClass().asType()));
             }
 
-            boolean isProtectedInSuperClassOfEnclosingClassInOtherPackage() {
-                return ((tree.sym.flags() & PROTECTED) != 0 &&
-                        tree.sym.packge() != owner.packge());
-            }
-
             /**
              * Erasure destroys the implementation parameter subtype
              * relationship for intersection types.
@@ -2311,7 +2309,7 @@
                         needsVarArgsConversion() ||
                         isArrayOp() ||
                         (!nestmateLambdas && isPrivateInOtherClass()) ||
-                        isProtectedInSuperClassOfEnclosingClassInOtherPackage() ||
+                        isProtectedInSuperClassOfEnclosingClassInOtherPackage(tree.sym, owner) ||
                         !receiverAccessible() ||
                         (tree.getMode() == ReferenceMode.NEW &&
                           tree.kind != ReferenceKind.ARRAY_CTOR &&
@@ -2386,6 +2384,12 @@
         }
     }
 
+    private boolean isProtectedInSuperClassOfEnclosingClassInOtherPackage(Symbol targetReference,
+                                                                          Symbol currentClass) {
+        return ((targetReference.flags() & PROTECTED) != 0 &&
+                targetReference.packge() != currentClass.packge());
+    }
+
     /**
      * Signature Generation
      */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/Versions.java	Mon Jun 22 18:23:49 2020 +0200
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.javadoc.internal;
+
+import java.util.ResourceBundle;
+
+import static java.util.ResourceBundle.getBundle;
+
+public final class Versions {
+
+    private Versions() { throw new AssertionError(); }
+
+    /**
+     * Returns the version of the {@code javadoc} tool and the Standard doclet.
+     *
+     * <p> This is typically the same as the version of the JDK platform being
+     * used to run the tool, but may be different when running the tool on an
+     * older version of the platform.
+     *
+     * @throws RuntimeException in an unlikely event of the version info
+     *                          not being available
+     *
+     * @apiNote This method does not return {@code null}, has the return type of
+     * {@code Optional<Runtime.Version>}, or throw a checked exception. Those
+     * would warp the API to cater for something that is probably a result of
+     * a build error anyway. Hence, {@code RuntimeException}.
+     *
+     * @return the version
+     */
+    public static Runtime.Version javadocVersion() throws RuntimeException {
+        /*
+         * The "jdk.javadoc.internal.tool.resources.version" resource bundle is
+         * non-localized and represented by a class compiled from a source like this:
+         *
+         * $ cat build/.../support/gensrc/jdk.javadoc/jdk/javadoc/internal/tool/resources/version.java
+         * package jdk.javadoc.internal.tool.resources;
+         *
+         * public final class version extends java.util.ListResourceBundle {
+         *     protected final Object[][] getContents() {
+         *         return new Object[][] {
+         *             { "full", "15-internal+0-2020-06-02-1426246.duke..." },
+         *             { "jdk", "15" },
+         *             { "release", "15-internal" },
+         *         };
+         *     }
+         * }
+         *
+         * The string keyed by "full" should be parseable by Runtime.Version.parse()
+         */
+        ResourceBundle bundle = getBundle("jdk.javadoc.internal.tool.resources.version");
+        return Runtime.Version.parse(bundle.getString("full"));
+    }
+
+    /**
+     * Returns a short string representation of the provided version.
+     *
+     * <p> Examples of strings returned from this method are: "15" and
+     * "15-internal".
+     *
+     * @return a short string representation of the provided version
+     *
+     * @throws NullPointerException if {@code v == null}
+     */
+    public static String shortVersionStringOf(Runtime.Version v) {
+        String svstr = String.valueOf(v.feature());
+        if (v.pre().isPresent()) {
+            svstr += "-" + v.pre().get();
+        }
+        return svstr;
+    }
+
+    /**
+     * Returns a full string representation of the provided version.
+     *
+     * <p> Examples of strings returned from this method are "14+36-1461" and
+     * "15-internal+0-2020-06-02-1426246.duke...".
+     *
+     * @return a full string representation of the provided version
+     *
+     * @throws NullPointerException if {@code v == null}
+     */
+    public static String fullVersionStringOf(Runtime.Version v) {
+        return v.toString();
+    }
+}
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractIndexWriter.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/AbstractIndexWriter.java	Mon Jun 22 18:23:49 2020 +0200
@@ -27,6 +27,7 @@
 
 import java.io.IOException;
 import java.io.Writer;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -105,8 +106,12 @@
         addHeading(uc, contentTree);
 
         HtmlTree dl = HtmlTree.DL(HtmlStyle.index);
+        Map<String,Integer> duplicateLabelCheck = new HashMap<>();
+        memberlist.forEach(e -> duplicateLabelCheck.compute(e.getFullyQualifiedLabel(utils),
+                (k, v) -> v == null ? 1 : v + 1));
         for (IndexItem indexItem : memberlist) {
-            addDescription(indexItem, dl);
+            addDescription(indexItem, dl,
+                    duplicateLabelCheck.get(indexItem.getFullyQualifiedLabel(utils)) > 1);
         }
         contentTree.add(dl);
     }
@@ -120,14 +125,14 @@
         contentTree.add(heading);
     }
 
-    protected void addDescription(IndexItem indexItem, Content dl) {
+    protected void addDescription(IndexItem indexItem, Content dl, boolean addModuleInfo) {
         SearchIndexItem si = indexItem.getSearchTag();
         if (si != null) {
             addDescription(si, dl);
         } else {
             si = new SearchIndexItem();
             si.setLabel(indexItem.getLabel());
-            addElementDescription(indexItem, dl, si);
+            addElementDescription(indexItem, dl, si, addModuleInfo);
             searchItems.add(si);
         }
     }
@@ -138,8 +143,10 @@
      * @param indexItem the element to be documented
      * @param dlTree the content tree to which the description will be added
      * @param si the search index item
+     * @param addModuleInfo whether to include module information
      */
-    protected void addElementDescription(IndexItem indexItem, Content dlTree, SearchIndexItem si) {
+    protected void addElementDescription(IndexItem indexItem, Content dlTree, SearchIndexItem si,
+                                         boolean addModuleInfo) {
         Content dt;
         Element element = indexItem.getElement();
         String label = indexItem.getLabel();
@@ -165,6 +172,9 @@
                 dt = HtmlTree.DT(getLink(new LinkInfoImpl(configuration,
                         LinkInfoImpl.Kind.INDEX, (TypeElement)element).strong(true)));
                 si.setContainingPackage(utils.getPackageName(utils.containingPackage(element)));
+                if (configuration.showModules && addModuleInfo) {
+                    si.setContainingModule(utils.getFullyQualifiedName(utils.containingModule(element)));
+                }
                 si.setCategory(Category.TYPES);
                 dt.add(" - ");
                 addClassInfo((TypeElement)element, dt);
@@ -175,6 +185,9 @@
                         getDocLink(LinkInfoImpl.Kind.INDEX, containingType, element, new StringContent(label))));
                 si.setContainingPackage(utils.getPackageName(utils.containingPackage(element)));
                 si.setContainingClass(utils.getSimpleName(containingType));
+                if (configuration.showModules && addModuleInfo) {
+                    si.setContainingModule(utils.getFullyQualifiedName(utils.containingModule(element)));
+                }
                 if (utils.isExecutableElement(element)) {
                     String url = HtmlTree.encodeURL(links.getName(getAnchor((ExecutableElement)element)));
                     if (!label.equals(url)) {
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/DeprecatedListWriter.java	Mon Jun 22 18:23:49 2020 +0200
@@ -205,8 +205,6 @@
 
     private EnumMap<DeprElementKind, AbstractMemberWriter> writerMap;
 
-    private HtmlConfiguration configuration;
-
     private final Navigation navBar;
 
     /**
@@ -218,7 +216,6 @@
 
     public DeprecatedListWriter(HtmlConfiguration configuration, DocPath filename) {
         super(configuration, filename);
-        this.configuration = configuration;
         this.navBar = new Navigation(null, configuration, PageMode.DEPRECATED, path);
         NestedClassWriterImpl classW = new NestedClassWriterImpl(this);
         writerMap = new EnumMap<>(DeprElementKind.class);
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HelpWriter.java	Mon Jun 22 18:23:49 2020 +0200
@@ -276,7 +276,7 @@
                             HtmlTree.CODE(new StringContent(example[0])), example[1])));
         }
         Content searchSpecLink = HtmlTree.A(
-                resources.getText("doclet.help.search.spec.url", Runtime.version().feature()),
+                resources.getText("doclet.help.search.spec.url", configuration.getDocletVersion().feature()),
                 getContent("doclet.help.search.spec.title"));
         Content searchRefer = HtmlTree.P(getContent("doclet.help.search.refer", searchSpecLink));
         section.add(searchIntro)
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlConfiguration.java	Mon Jun 22 18:23:49 2020 +0200
@@ -42,6 +42,7 @@
 import jdk.javadoc.doclet.Reporter;
 import jdk.javadoc.doclet.StandardDoclet;
 import jdk.javadoc.doclet.Taglet;
+import jdk.javadoc.internal.Versions;
 import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration;
 import jdk.javadoc.internal.doclets.toolkit.DocletException;
 import jdk.javadoc.internal.doclets.toolkit.Messages;
@@ -51,8 +52,6 @@
 import jdk.javadoc.internal.doclets.toolkit.util.DocPath;
 import jdk.javadoc.internal.doclets.toolkit.util.DocPaths;
 
-import static javax.tools.Diagnostic.Kind.*;
-
 /**
  * Configure the output based on the command-line options.
  * <p>
@@ -142,32 +141,30 @@
         contents = new Contents(this);
         options = new HtmlOptions(this);
 
-        String v;
+        Runtime.Version v;
         try {
-            // the version bundle is not localized
-            ResourceBundle rb = ResourceBundle.getBundle(versionBundleName, Locale.getDefault());
-            try {
-                v = rb.getString("release");
-            } catch (MissingResourceException e) {
-                v = defaultDocletVersion;
-            }
-        } catch (MissingResourceException e) {
-            v = defaultDocletVersion;
+            v = Versions.javadocVersion();
+        } catch (RuntimeException e) {
+            assert false : e;
+            v = Runtime.version(); // arguably, the only sensible default
         }
         docletVersion = v;
     }
 
-    private static final String versionBundleName = "jdk.javadoc.internal.tool.resources.version";
-    private static final String defaultDocletVersion = System.getProperty("java.version");
-    public final String docletVersion;
+    private final Runtime.Version docletVersion;
     public final Date startTime = new Date();
 
     @Override
-    public String getDocletVersion() {
+    public Runtime.Version getDocletVersion() {
         return docletVersion;
     }
 
     @Override
+    public String getDocletVersionString() {
+        return Versions.shortVersionStringOf(docletVersion);
+    }
+
+    @Override
     public Resources getDocResources() {
         return docResources;
     }
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlDocletWriter.java	Mon Jun 22 18:23:49 2020 +0200
@@ -431,7 +431,7 @@
         Content htmlComment = contents.newPage;
         List<DocPath> additionalStylesheets = configuration.getAdditionalStylesheets();
         additionalStylesheets.addAll(localStylesheets);
-        Head head = new Head(path, configuration.docletVersion, configuration.startTime)
+        Head head = new Head(path, configuration.getDocletVersionString(), configuration.startTime)
                 .setTimestamp(!options.noTimestamp())
                 .setDescription(description)
                 .setGenerator(getGenerator(getClass()))
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/IndexRedirectWriter.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/IndexRedirectWriter.java	Mon Jun 22 18:23:49 2020 +0200
@@ -75,7 +75,7 @@
      */
     private void generateIndexFile() throws DocFileIOException {
         Content htmlComment = contents.newPage;
-        Head head = new Head(path, configuration.docletVersion, configuration.startTime)
+        Head head = new Head(path, configuration.getDocletVersionString(), configuration.startTime)
                 .setTimestamp(!options.noTimestamp())
                 .setDescription("index redirect")
                 .setGenerator(getGenerator(getClass()))
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SearchIndexItem.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SearchIndexItem.java	Mon Jun 22 18:23:49 2020 +0200
@@ -148,6 +148,9 @@
                 if (!containingPackage.isEmpty()) {
                     item.append("\"p\":\"").append(containingPackage).append("\",");
                 }
+                if (!containingModule.isEmpty()) {
+                    item.append("\"m\":\"").append(containingModule).append("\",");
+                }
                 item.append("\"l\":\"").append(label).append("\"");
                 if (!url.isEmpty()) {
                     item.append(",\"u\":\"").append(url).append("\"");
@@ -155,8 +158,11 @@
                 item.append("}");
                 break;
             case MEMBERS:
-                item.append("{")
-                        .append("\"p\":\"").append(containingPackage).append("\",")
+                item.append("{");
+                if (!containingModule.isEmpty()) {
+                    item.append("\"m\":\"").append(containingModule).append("\",");
+                }
+                item.append("\"p\":\"").append(containingPackage).append("\",")
                         .append("\"c\":\"").append(containingClass).append("\",")
                         .append("\"l\":\"").append(label).append("\"");
                 if (!url.isEmpty()) {
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SourceToHTMLConverter.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/SourceToHTMLConverter.java	Mon Jun 22 18:23:49 2020 +0200
@@ -235,7 +235,7 @@
      * @param path the path for the file.
      */
     private void writeToFile(Content body, DocPath path, TypeElement te) throws DocFileIOException {
-        Head head = new Head(path, configuration.docletVersion, configuration.startTime)
+        Head head = new Head(path, configuration.getDocletVersionString(), configuration.startTime)
 //                .setTimestamp(!options.notimestamp) // temporary: compatibility!
                 .setTitle(resources.getText("doclet.Window_Source_title"))
 //                .setCharset(options.charset) // temporary: compatibility!
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/search.js	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/search.js	Mon Jun 22 18:23:49 2020 +0200
@@ -34,6 +34,7 @@
 var RANKING_THRESHOLD = 2;
 var NO_MATCH = 0xffff;
 var MAX_RESULTS_PER_CATEGORY = 500;
+var UNNAMED = "<Unnamed>";
 function escapeHtml(str) {
     return str.replace(/</g, "&lt;").replace(/>/g, "&gt;");
 }
@@ -48,14 +49,16 @@
         return ui.item.l + slash;
     } else if (ui.item.category === catPackages && ui.item.m) {
         return ui.item.m + slash;
-    } else if ((ui.item.category === catTypes && ui.item.p) || ui.item.category === catMembers) {
-        $.each(packageSearchIndex, function(index, item) {
-            if (item.m && ui.item.p == item.l) {
-                urlPrefix = item.m + slash;
-            }
-        });
-        return urlPrefix;
-    } else {
+    } else if (ui.item.category === catTypes || ui.item.category === catMembers) {
+        if (ui.item.m) {
+            urlPrefix = ui.item.m + slash;
+        } else {
+            $.each(packageSearchIndex, function(index, item) {
+                if (item.m && ui.item.p === item.l) {
+                    urlPrefix = item.m + slash;
+                }
+            });
+        }
         return urlPrefix;
     }
     return urlPrefix;
@@ -121,7 +124,7 @@
         rMenu.menu.bindings = $();
         $.each(items, function(index, item) {
             var li;
-            if (item.l !== noResult.l && item.category !== currentCategory) {
+            if (item.category && item.category !== currentCategory) {
                 ul.append("<li class=\"ui-autocomplete-category\">" + item.category + "</li>");
                 currentCategory = item.category;
             }
@@ -141,15 +144,15 @@
         if (item.category === catModules) {
             label = getHighlightedText(item.l, matcher);
         } else if (item.category === catPackages) {
-            label = (item.m)
-                    ? getHighlightedText(item.m + "/" + item.l, matcher)
-                    : getHighlightedText(item.l, matcher);
+            label = getHighlightedText(item.l, matcher);
         } else if (item.category === catTypes) {
-            label = (item.p)
+            label = (item.p && item.p !== UNNAMED)
                     ? getHighlightedText(item.p + "." + item.l, matcher)
                     : getHighlightedText(item.l, matcher);
         } else if (item.category === catMembers) {
-            label = getHighlightedText(item.p + "." + (item.c + "." + item.l), matcher);
+            label = (item.p && item.p !== UNNAMED)
+                    ? getHighlightedText(item.p + "." + item.c + "." + item.l, matcher)
+                    : getHighlightedText(item.c + "." + item.l, matcher);
         } else if (item.category === catSearchTags) {
             label = getHighlightedText(item.l, matcher);
         } else {
@@ -165,7 +168,11 @@
                 div.html(label + "<span class=\"search-tag-holder-result\"> (" + item.h + ")</span>");
             }
         } else {
-            div.html(label);
+            if (item.m) {
+                div.html(item.m + "/" + label);
+            } else {
+                div.html(label);
+            }
         }
         return li;
     }
@@ -317,7 +324,7 @@
             collision: "flip"
         },
         select: function(event, ui) {
-            if (ui.item.l !== noResult.l) {
+            if (ui.item.category) {
                 var url = getURLPrefix(ui);
                 if (ui.item.category === catModules) {
                     url += "module-summary.html";
@@ -330,13 +337,13 @@
                 } else if (ui.item.category === catTypes) {
                     if (ui.item.u) {
                         url = ui.item.u;
-                    } else if (ui.item.p === "<Unnamed>") {
+                    } else if (ui.item.p === UNNAMED) {
                         url += ui.item.l + ".html";
                     } else {
                         url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.l + ".html";
                     }
                 } else if (ui.item.category === catMembers) {
-                    if (ui.item.p === "<Unnamed>") {
+                    if (ui.item.p === UNNAMED) {
                         url += ui.item.c + ".html" + "#";
                     } else {
                         url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.c + ".html" + "#";
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties	Mon Jun 22 18:23:49 2020 +0200
@@ -144,7 +144,7 @@
     each. These pages may contain six categories:
 doclet.help.module.intro=\
     Each module has a page that contains a list of its packages, dependencies on other modules, \
-    and services, with a summary for each. These page may contain three categories:
+    and services, with a summary for each. These pages may contain three categories:
 doclet.help.class_interface.head=\
     Class or Interface
 doclet.help.class_interface.intro=\
@@ -164,7 +164,6 @@
 doclet.help.class_interface.description=\
     Class or Interface Description
 doclet.help.class_interface.summary=\
-    Each summary entry contains the first sentence from the detailed description for that item. \
     The summary entries are alphabetical, while the detailed descriptions are in the order they \
     appear in the source code. This preserves the logical groupings established by the programmer.
 doclet.help.use.head=\
@@ -189,7 +188,7 @@
     hierarchy for only that package.
 doclet.help.deprecated.body=\
     The {0} page lists all of the API that have been deprecated. A deprecated API is not \
-    recommended for use, generally due to improvements, and a replacement API is usually given. \
+    recommended for use, generally due to shortcomings, and a replacement API is usually given. \
     Deprecated APIs may be removed in future implementations.
 doclet.help.index.head=\
     Index
@@ -198,9 +197,9 @@
     and fields, as well as lists of all packages and all classes.
 doclet.help.serial_form.body=\
     Each serializable or externalizable class has a description of its serialization fields and \
-    methods. This information is of interest to re-implementors, not to developers using the API. \
+    methods. This information is of interest to those who implement rather than use the API. \
     While there is no link in the navigation bar, you can get to this information by going to any \
-    serialized class and clicking "Serialized Form" in the "See also" section of the class \
+    serialized class and clicking "Serialized Form" in the "See Also" section of the class \
     description.
 doclet.help.constants.body=\
     The {0} page lists the static final fields and their values.
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/BaseConfiguration.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/BaseConfiguration.java	Mon Jun 22 18:23:49 2020 +0200
@@ -151,11 +151,19 @@
     public abstract Resources getDocResources();
 
     /**
-     * Returns a string identifying the version of the doclet.
+     * Returns the version of the {@link #doclet doclet}.
      *
-     * @return a version string
+     * @return the version
      */
-    public abstract String getDocletVersion();
+    public abstract Runtime.Version getDocletVersion();
+
+    /**
+     * Returns a short string representation of the version returned by
+     * {@linkplain #getDocletVersion()}.
+     *
+     * @return a short string representation of the version
+     */
+    public abstract String getDocletVersionString();
 
     /**
      * This method should be defined in all those doclets (configurations),
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Comparators.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Comparators.java	Mon Jun 22 18:23:49 2020 +0200
@@ -139,9 +139,15 @@
                 @Override
                 public int compare(Element e1, Element e2) {
                     int result = compareFullyQualifiedNames(e1, e2);
-                    if (result == 0)
-                        result = compareModuleNames(e1, e2);
-                    return result;
+                    if (result != 0) {
+                        return result;
+                    }
+                    // if elements are executable compare their parameter arrays
+                    result = compareParameters(e1, e2);
+                    if (result != 0) {
+                        return result;
+                    }
+                    return compareModuleNames(e1, e2);
                 }
             };
         }
@@ -256,19 +262,11 @@
                     if (result != 0) {
                         return result;
                     }
-                    // if element kinds are the same, and are methods,
-                    // compare the method parameters
-                    if (hasParameters(e1)) {
-                        List<? extends VariableElement> parameters1 = ((ExecutableElement)e1).getParameters();
-                        List<? extends VariableElement> parameters2 = ((ExecutableElement)e2).getParameters();
-                        result = compareParameters(false, parameters1, parameters2);
-                        if (result != 0) {
-                            return result;
-                        }
-                        result = compareParameters(true, parameters1, parameters2);
-                        if (result != 0) {
-                            return result;
-                        }
+                    // if element kinds are the same, and are executable,
+                    // compare the parameter arrays
+                    result = compareParameters(e1, e2);
+                    if (result != 0) {
+                        return result;
                     }
                     // else fall back on fully qualified names
                     result = compareFullyQualifiedNames(e1, e2);
@@ -383,15 +381,7 @@
                     if (result != 0) {
                         return result;
                     }
-                    if (hasParameters(e1) && hasParameters(e2)) {
-                        List<? extends VariableElement> parameters1 = ((ExecutableElement)e1).getParameters();
-                        List<? extends VariableElement> parameters2 = ((ExecutableElement)e2).getParameters();
-                        result = compareParameters(false, parameters1, parameters2);
-                        if (result != 0) {
-                            return result;
-                        }
-                        result = compareParameters(true, parameters1, parameters2);
-                    }
+                    result = compareParameters(e1, e2);
                     if (result != 0) {
                         return result;
                     }
@@ -504,6 +494,34 @@
             return 0;
         }
 
+        /**
+         * Compares the parameter arrays of two elements if they both are executable.
+         * @param e1 the first element
+         * @param e2 the second element
+         * @return a negative integer, zero, or a positive integer as the first
+         *         argument is less than, equal to, or greater than the second
+         */
+        protected int compareParameters(Element e1, Element e2) {
+            int result = 0;
+            if (hasParameters(e1) && hasParameters(e2)) {
+                List<? extends VariableElement> parameters1 = ((ExecutableElement)e1).getParameters();
+                List<? extends VariableElement> parameters2 = ((ExecutableElement)e2).getParameters();
+                result = compareParameters(false, parameters1, parameters2);
+                if (result != 0) {
+                    return result;
+                }
+                result = compareParameters(true, parameters1, parameters2);
+            }
+            return result;
+        }
+
+        /**
+         * Compares the kinds of two elements.
+         * @param e1 the first element
+         * @param e2 the second element
+         * @return a negative integer, zero, or a positive integer as the first
+         *         argument is less than, equal to, or greater than the second
+         */
         protected int compareElementKinds(Element e1, Element e2) {
             return Integer.compare(getKindIndex(e1), getKindIndex(e2));
         }
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/IndexItem.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/IndexItem.java	Mon Jun 22 18:23:49 2020 +0200
@@ -26,7 +26,6 @@
 package jdk.javadoc.internal.doclets.toolkit.util;
 
 import jdk.javadoc.internal.doclets.formats.html.SearchIndexItem;
-import jdk.javadoc.internal.doclets.toolkit.BaseConfiguration;
 
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ExecutableElement;
@@ -90,6 +89,16 @@
         return label;
     }
 
+    public String getFullyQualifiedLabel(Utils utils) {
+        if (typeElement != null) {
+            return utils.getFullyQualifiedName(typeElement) + "." + label;
+        } else if (element != null) {
+            return utils.getFullyQualifiedName(element);
+        } else {
+            return label;
+        }
+    }
+
     public Element getElement() {
         return element;
     }
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkFactory.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/links/LinkFactory.java	Mon Jun 22 18:23:49 2020 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -109,6 +109,7 @@
                 @Override
                 public Content visitWildcard(WildcardType type, LinkInfo linkInfo) {
                     linkInfo.isTypeBound = true;
+                    link.add(getTypeAnnotationLinks(linkInfo));
                     link.add("?");
                     TypeMirror extendsBound = type.getExtendsBound();
                     if (extendsBound != null) {
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/Start.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/Start.java	Mon Jun 22 18:23:49 2020 +0200
@@ -31,16 +31,14 @@
 import java.text.BreakIterator;
 import java.text.Collator;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.IllformedLocaleException;
 import java.util.List;
 import java.util.Locale;
-import java.util.MissingResourceException;
 import java.util.Objects;
-import java.util.ResourceBundle;
 import java.util.Set;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
 import javax.tools.JavaFileManager;
@@ -62,6 +60,7 @@
 import jdk.javadoc.doclet.Doclet.Option;
 import jdk.javadoc.doclet.DocletEnvironment;
 import jdk.javadoc.doclet.StandardDoclet;
+import jdk.javadoc.internal.Versions;
 import jdk.javadoc.internal.tool.Main.Result;
 import jdk.javadoc.internal.tool.ToolOptions.ToolOption;
 
@@ -167,17 +166,30 @@
 
             @Override
             public void version() {
-                showVersion("javadoc.version", "release");
+                showVersion("javadoc.version", orDefault(() -> Versions.shortVersionStringOf(toolVersion())));
             }
 
             @Override
             public void fullVersion() {
-                showVersion("javadoc.fullversion", "full");
+                showVersion("javadoc.fullversion", orDefault(() -> Versions.fullVersionStringOf(toolVersion())));
+            }
+
+            private String orDefault(Supplier<String> s) {
+                try {
+                    return s.get();
+                } catch (RuntimeException e) {
+                    assert false : e;
+                    return Log.getLocalizedString("version.not.available");
+                }
             }
         };
         return new ToolOptions(context, messager, helper);
     }
 
+    private Runtime.Version toolVersion() {
+        return Versions.javadocVersion();
+    }
+
     private void showUsage() {
         showUsage("main.usage", ToolOption.Kind.STANDARD, "main.usage.foot");
     }
@@ -196,26 +208,8 @@
             messager.notice(footerKey);
     }
 
-    private static final String versionRBName = "jdk.javadoc.internal.tool.resources.version";
-    private static ResourceBundle versionRB;
-
-    private void showVersion(String labelKey, String versionKey) {
-        messager.notice(labelKey, messager.programName, getVersion(versionKey));
-    }
-
-    private static String getVersion(String key) {
-        if (versionRB == null) {
-            try {
-                versionRB = ResourceBundle.getBundle(versionRBName);
-            } catch (MissingResourceException e) {
-                return Log.getLocalizedString("version.not.available");
-            }
-        }
-        try {
-            return versionRB.getString(key);
-        } catch (MissingResourceException e) {
-            return Log.getLocalizedString("version.not.available");
-        }
+    private void showVersion(String labelKey, String value) {
+        messager.notice(labelKey, messager.programName, value);
     }
 
     private void showToolOptions(ToolOption.Kind kind) {
--- a/src/jdk.jdi/share/classes/com/sun/jdi/Type.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.jdi/share/classes/com/sun/jdi/Type.java	Mon Jun 22 18:23:49 2020 +0200
@@ -152,7 +152,7 @@
      * Returns the name of this type. The result is of the same form as
      * the name returned by {@link Class#getName()}.
      * The returned name may not be a
-     * <a href="${docRoot}/java.base/java/lang/ClassLoader.html#binary-name">binary name</a>.
+     * <a href="{@docRoot}/java.base/java/lang/ClassLoader.html#binary-name">binary name</a>.
      *
      * @return the name of this type
      */
--- a/src/jdk.jdi/share/classes/com/sun/jdi/event/ClassUnloadEvent.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.jdi/share/classes/com/sun/jdi/event/ClassUnloadEvent.java	Mon Jun 22 18:23:49 2020 +0200
@@ -44,7 +44,7 @@
     /**
      * Returns the {@linkplain com.sun.jdi.Type#name() name of the class}
      * that has been unloaded. The returned string may not be a
-     * <a href="${docRoot}/java.base/java/lang/ClassLoader.html#binary-name">binary name</a>.
+     * <a href="{@docRoot}/java.base/java/lang/ClassLoader.html#binary-name">binary name</a>.
      *
      * @see Class#getName()
      */
--- a/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java	Mon Jun 22 18:23:49 2020 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -34,6 +34,7 @@
 import java.io.InterruptedIOException;
 import java.io.OutputStream;
 import java.io.PrintStream;
+import java.net.URI;
 import java.nio.charset.Charset;
 import java.time.Instant;
 import java.util.ArrayList;
@@ -50,6 +51,9 @@
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
+import javax.tools.DiagnosticListener;
+import javax.tools.JavaFileObject;
+import javax.tools.SimpleJavaFileObject;
 
 import jdk.internal.shellsupport.doc.JavadocFormatter;
 import jdk.internal.jshell.tool.StopDetectingInputStream.State;
@@ -974,6 +978,15 @@
         int pendingBraces = 0;
         com.sun.tools.javac.util.Context ctx =
                 new com.sun.tools.javac.util.Context();
+        SimpleJavaFileObject source = new SimpleJavaFileObject(URI.create("mem://snippet"),
+                                                               JavaFileObject.Kind.SOURCE) {
+            @Override
+            public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
+                return code;
+            }
+        };
+        ctx.put(DiagnosticListener.class, d -> {});
+        com.sun.tools.javac.util.Log.instance(ctx).useSource(source);
         com.sun.tools.javac.parser.ScannerFactory scannerFactory =
                 com.sun.tools.javac.parser.ScannerFactory.instance(ctx);
         com.sun.tools.javac.parser.Scanner scanner =
--- a/src/jdk.unsupported/share/classes/sun/misc/Unsafe.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.unsupported/share/classes/sun/misc/Unsafe.java	Mon Jun 22 18:23:49 2020 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -636,13 +636,18 @@
      * @see #getInt(Object, long)
      */
     @ForceInline
+    @SuppressWarnings("preview")
     public long objectFieldOffset(Field f) {
         if (f == null) {
             throw new NullPointerException();
         }
-        if (f.getDeclaringClass().isHidden()) {
+        Class<?> declaringClass = f.getDeclaringClass();
+        if (declaringClass.isHidden()) {
             throw new UnsupportedOperationException("can't get field offset on a hidden class: " + f);
         }
+        if (declaringClass.isRecord()) {
+            throw new UnsupportedOperationException("can't get field offset on a record (preview): " + f);
+        }
         return theInternalUnsafe.objectFieldOffset(f);
     }
 
@@ -664,13 +669,18 @@
      * @see #getInt(Object, long)
      */
     @ForceInline
+    @SuppressWarnings("preview")
     public long staticFieldOffset(Field f) {
         if (f == null) {
             throw new NullPointerException();
         }
-        if (f.getDeclaringClass().isHidden()) {
+        Class<?> declaringClass = f.getDeclaringClass();
+        if (declaringClass.isHidden()) {
             throw new UnsupportedOperationException("can't get field offset on a hidden class: " + f);
         }
+        if (declaringClass.isRecord()) {
+            throw new UnsupportedOperationException("can't get field offset on a record (preview): " + f);
+        }
         return theInternalUnsafe.staticFieldOffset(f);
     }
 
@@ -685,13 +695,18 @@
      * this class.
      */
     @ForceInline
+    @SuppressWarnings("preview")
     public Object staticFieldBase(Field f) {
         if (f == null) {
             throw new NullPointerException();
         }
-        if (f.getDeclaringClass().isHidden()) {
+        Class<?> declaringClass = f.getDeclaringClass();
+        if (declaringClass.isHidden()) {
             throw new UnsupportedOperationException("can't get base address on a hidden class: " + f);
         }
+        if (declaringClass.isRecord()) {
+            throw new UnsupportedOperationException("can't get base address on a record (preview): " + f);
+        }
         return theInternalUnsafe.staticFieldBase(f);
     }
 
--- a/src/jdk.zipfs/share/classes/module-info.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/src/jdk.zipfs/share/classes/module-info.java	Mon Jun 22 18:23:49 2020 +0200
@@ -234,9 +234,9 @@
  *   <td>null/unset</td>
  *   <td>
  *       A value representing the version entry to use when accessing a
- *       <a href=="{@docRoot}/../specs/jar/jar.html#multi-release-jar-files">
+ *       <a href="{@docRoot}/../specs/jar/jar.html#multi-release-jar-files">
  *       multi-release JAR</a>. If the JAR is not a
- *       <a href=="{@docRoot}/../specs/jar/jar.html#multi-release-jar-files">
+ *       <a href="{@docRoot}/../specs/jar/jar.html#multi-release-jar-files">
  *       multi-release JAR</a>, the value will be ignored and the JAR will be
  *       considered un-versioned.
  *       <p>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/hotspot/jtreg/compiler/stringopts/TestLongStringConcat.java	Mon Jun 22 18:23:49 2020 +0200
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8237950
+ * @summary Test very long chain of StringBuilder append calls.
+ * @run main/othervm -Xbatch compiler.stringopts.TestLongStringConcat
+ */
+
+package compiler.stringopts;
+
+public class TestLongStringConcat {
+
+    public static String test() {
+        return (new StringBuilder("")).append("1").append("2").append("3").append("4").
+            append("5").append("6").append("7").append("8").append("9").append("10").
+            append("11").append("12").append("13").append("14").append("15").append("16").
+            append("17").append("18").append("19").append("20").append("21").append("22").
+            append("23").append("24").append("25").append("26").append("27").append("28").
+            append("29").append("30").append("31").append("32").append("33").append("34").
+            append("35").append("36").append("37").append("38").append("39").append("40").
+            append("41").append("42").append("43").append("44").append("45").append("46").
+            append("47").append("48").append("49").append("50").append("51").append("52").
+            append("53").append("54").append("55").append("56").append("57").append("58").
+            append("59").append("60").append("61").append("62").append("63").append("64").
+            append("65").append("66").append("67").append("68").append("69").append("70").
+            append("71").append("72").append("73").append("74").append("75").append("76").
+            append("77").append("78").append("79").append("80").append("81").append("82").
+            append("83").append("84").append("85").append("86").append("87").append("88").
+            append("89").append("90").append("91").append("92").append("93").append("94").
+            append("95").append("96").append("97").append("98").append("99").append("100").
+            append("101").append("102").append("103").append("104").append("105").
+            append("106").append("107").append("108").append("109").append("110").
+            append("111").append("112").append("113").append("114").append("115").
+            append("116").append("117").append("118").append("119").append("120").
+            append("121").append("122").append("123").append("124").append("125").
+            append("126").append("127").append("128").append("129").append("130").
+            append("131").append("132").append("133").append("134").append("135").
+            append("136").append("137").append("138").append("139").append("140").
+            append("141").append("142").append("143").append("144").append("145").
+            append("146").append("147").append("148").append("149").append("150").
+            append("151").append("152").append("153").append("154").append("155").
+            append("156").append("157").append("158").append("159").append("160").
+            append("161").append("162").append("163").append("164").append("165").
+            append("166").append("167").append("168").append("169").append("170").
+            append("171").append("172").append("173").append("174").append("175").
+            append("176").append("177").append("178").append("179").append("180").
+            append("181").append("182").append("183").append("184").append("185").
+            append("186").append("187").append("188").append("189").append("190").
+            append("191").append("192").append("193").append("194").append("195").
+            append("196").append("197").append("198").append("199").append("200").
+            toString();
+    }
+
+    public static void main(String[] args) {
+        for (int i = 0; i < 100_000; ++i) {
+            test();
+        }
+    }
+}
--- a/test/hotspot/jtreg/runtime/exceptionMsgs/NullPointerException/SuppressMessagesTest.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/hotspot/jtreg/runtime/exceptionMsgs/NullPointerException/SuppressMessagesTest.java	Mon Jun 22 18:23:49 2020 +0200
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2019 SAP SE. All rights reserved.
+ * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2020 SAP SE. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,12 +24,12 @@
 
 /**
  * @test
- * @summary Test that the default of flag ShowCodeDetailsInExceptionMessages is 'false',
- *          i.e., make sure the VM does not print the message on default.
+ * @summary Test that the default of flag ShowCodeDetailsInExceptionMessages is 'true',
+ *          i.e., make sure the VM does print the message by default.
  * @bug 8218628
  * @library /test/lib
  * @compile -g SuppressMessagesTest.java
- * @run main/othervm SuppressMessagesTest noMessage
+ * @run main/othervm SuppressMessagesTest printMessage
  */
 /**
  * @test
--- a/test/hotspot/jtreg/vmTestbase/jit/t/t104/t104.gold	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/hotspot/jtreg/vmTestbase/jit/t/t104/t104.gold	Mon Jun 22 18:23:49 2020 +0200
@@ -1,2 +1,2 @@
 Exception thrown.
-java.lang.NullPointerException
+java.lang.NullPointerException: Cannot enter synchronized block because "<local1>" is null
--- a/test/jdk/java/lang/invoke/defineHiddenClass/UnreflectTest.java	Mon Jun 22 11:40:06 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,155 +0,0 @@
-/*
- * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/**
- * @test
- * @compile src/Fields.java
- * @run testng/othervm UnreflectTest
- * @summary Test Lookup::unreflectSetter and Lookup::unreflectVarHandle
- */
-
-import java.io.IOException;
-import java.io.UncheckedIOException;
-import java.lang.invoke.MethodHandle;
-import java.lang.invoke.MethodHandles;
-import java.lang.invoke.VarHandle;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
-import org.testng.annotations.Test;
-import static org.testng.Assert.*;
-
-public class UnreflectTest {
-    static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
-    static final Class<?> hiddenClass = defineHiddenClass();
-    private static Class<?> defineHiddenClass() {
-        String classes = System.getProperty("test.classes");
-        Path cf = Paths.get(classes, "Fields.class");
-        try {
-            byte[] bytes = Files.readAllBytes(cf);
-            return MethodHandles.lookup().defineHiddenClass(bytes, true).lookupClass();
-        } catch (IOException e) {
-            throw new UncheckedIOException(e);
-        } catch (IllegalAccessException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /*
-     * Test Lookup::unreflectSetter and Lookup::unreflectVarHandle that
-     * can write the value of a non-static final field in a normal class
-     */
-    @Test
-    public void testFieldsInNormalClass() throws Throwable {
-        // despite the name "HiddenClass", this class is loaded by the
-        // class loader as non-hidden class
-        Class<?> c = Fields.class;
-        Fields o = new Fields();
-        assertFalse(c.isHidden());
-        readOnlyAccessibleObject(c, "STATIC_FINAL", null, true);
-        readWriteAccessibleObject(c, "STATIC_NON_FINAL", null, false);
-        readWriteAccessibleObject(c, "FINAL", o, true);
-        readWriteAccessibleObject(c, "NON_FINAL", o, false);
-    }
-
-    /*
-     * Test Lookup::unreflectSetter and Lookup::unreflectVarHandle that
-     * has NO write the value of a non-static final field in a hidden class
-     */
-    @Test
-    public void testFieldsInHiddenClass() throws Throwable {
-        assertTrue(hiddenClass.isHidden());
-        Object o = hiddenClass.newInstance();
-        readOnlyAccessibleObject(hiddenClass, "STATIC_FINAL", null, true);
-        readWriteAccessibleObject(hiddenClass, "STATIC_NON_FINAL", null, false);
-        readOnlyAccessibleObject(hiddenClass, "FINAL", o, true);
-        readWriteAccessibleObject(hiddenClass, "NON_FINAL", o, false);
-    }
-
-    /*
-     * Verify read-only access via unreflectSetter and unreflectVarHandle
-     */
-    private static void readOnlyAccessibleObject(Class<?> c, String name, Object o, boolean isFinal) throws Throwable {
-        Field f = c.getDeclaredField(name);
-        int modifier = f.getModifiers();
-        if (isFinal) {
-            assertTrue(Modifier.isFinal(modifier));
-        } else {
-            assertFalse(Modifier.isFinal(modifier));
-        }
-        assertTrue(f.trySetAccessible());
-
-        // Field object with read-only access
-        MethodHandle mh = LOOKUP.unreflectGetter(f);
-        Object value = Modifier.isStatic(modifier) ? mh.invoke() : mh.invoke(o);
-        assertTrue(value == f.get(o));
-        try {
-            LOOKUP.unreflectSetter(f);
-            assertTrue(false, "should fail to unreflect a setter for " + name);
-        } catch (IllegalAccessException e) {
-        }
-
-        VarHandle vh = LOOKUP.unreflectVarHandle(f);
-        if (isFinal) {
-            assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.SET));
-        } else {
-            assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET));
-        }
-    }
-
-    private static void readWriteAccessibleObject(Class<?> c, String name, Object o, boolean isFinal) throws Throwable {
-        Field f = c.getDeclaredField(name);
-        int modifier = f.getModifiers();
-        if (isFinal) {
-            assertTrue(Modifier.isFinal(modifier));
-        } else {
-            assertFalse(Modifier.isFinal(modifier));
-        }
-        assertTrue(f.trySetAccessible());
-
-        // Field object with read-write access
-        MethodHandle mh = MethodHandles.lookup().unreflectGetter(f);
-        Object value = Modifier.isStatic(modifier) ? mh.invoke() : mh.invoke(o);
-        assertTrue(value == f.get(o));
-        try {
-            MethodHandle setter = MethodHandles.lookup().unreflectSetter(f);
-            if (Modifier.isStatic(modifier)) {
-                setter.invokeExact(value);
-            } else {
-                setter.invoke(o, value);
-            }
-        } catch (IllegalAccessException e) {
-            throw e;
-        }
-
-        VarHandle vh = LOOKUP.unreflectVarHandle(f);
-        if (isFinal) {
-            assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.SET));
-        } else {
-            assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET));
-        }
-    }
-}
--- a/test/jdk/java/lang/invoke/defineHiddenClass/src/Fields.java	Mon Jun 22 11:40:06 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-public class Fields {
-    static final Object STATIC_FINAL = new Object();
-    static Object STATIC_NON_FINAL = new Object();
-    final Object FINAL = new Object();
-    Object NON_FINAL = new Object();
-
-    public String name() {
-        return this.getClass().getName();
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/lang/invoke/unreflect/Fields.java	Mon Jun 22 18:23:49 2020 +0200
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+public class Fields {
+    static final Object STATIC_FINAL = new Object();
+    static Object STATIC_NON_FINAL = new Object();
+    final Object FINAL = new Object();
+    Object NON_FINAL = new Object();
+
+    public String name() {
+        return this.getClass().getName();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/lang/invoke/unreflect/TEST.properties	Mon Jun 22 18:23:49 2020 +0200
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+enablePreview=true
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/java/lang/invoke/unreflect/UnreflectTest.java	Mon Jun 22 18:23:49 2020 +0200
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8238358 8247444
+ * @run testng/othervm --enable-preview UnreflectTest
+ * @summary Test Lookup::unreflectSetter and Lookup::unreflectVarHandle on
+ *          trusted final fields (declared in hidden classes and records)
+ */
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.testng.annotations.Test;
+import static org.testng.Assert.*;
+
+public class UnreflectTest {
+    static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
+    static final Class<?> hiddenClass = defineHiddenClass();
+    private static Class<?> defineHiddenClass() {
+        String classes = System.getProperty("test.classes");
+        Path cf = Paths.get(classes, "Fields.class");
+        try {
+            byte[] bytes = Files.readAllBytes(cf);
+            return MethodHandles.lookup().defineHiddenClass(bytes, true).lookupClass();
+        } catch (IOException e) {
+            throw new UncheckedIOException(e);
+        } catch (IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /*
+     * Test Lookup::unreflectSetter and Lookup::unreflectVarHandle that
+     * can write the value of a non-static final field in a normal class
+     */
+    @Test
+    public void testFieldsInNormalClass() throws Throwable {
+        // despite the name "HiddenClass", this class is loaded by the
+        // class loader as non-hidden class
+        Class<?> c = Fields.class;
+        Fields o = new Fields();
+        assertFalse(c.isHidden());
+        readOnlyAccessibleObject(c, "STATIC_FINAL", null, true);
+        readWriteAccessibleObject(c, "STATIC_NON_FINAL", null, false);
+        readWriteAccessibleObject(c, "FINAL", o, true);
+        readWriteAccessibleObject(c, "NON_FINAL", o, false);
+    }
+
+    /*
+     * Test Lookup::unreflectSetter and Lookup::unreflectVarHandle that
+     * has NO write the value of a non-static final field in a hidden class
+     */
+    @Test
+    public void testFieldsInHiddenClass() throws Throwable {
+        assertTrue(hiddenClass.isHidden());
+        Object o = hiddenClass.newInstance();
+        readOnlyAccessibleObject(hiddenClass, "STATIC_FINAL", null, true);
+        readWriteAccessibleObject(hiddenClass, "STATIC_NON_FINAL", null, false);
+        readOnlyAccessibleObject(hiddenClass, "FINAL", o, true);
+        readWriteAccessibleObject(hiddenClass, "NON_FINAL", o, false);
+    }
+
+    static record TestRecord(int i) {
+        static final Object STATIC_FINAL = new Object();
+        static Object STATIC_NON_FINAL = new Object();
+    }
+
+    /*
+     * Test Lookup::unreflectSetter and Lookup::unreflectVarHandle that
+     * cannot write the value of a non-static final field in a record class
+     */
+    @SuppressWarnings("preview")
+    public void testFieldsInRecordClass() throws Throwable {
+        assertTrue(TestRecord.class.isRecord());
+        Object o = new TestRecord(1);
+        readOnlyAccessibleObject(TestRecord.class, "STATIC_FINAL", null, true);
+        readWriteAccessibleObject(TestRecord.class, "STATIC_NON_FINAL", null, false);
+        readOnlyAccessibleObject(TestRecord.class, "i", o, true);
+    }
+
+    /*
+     * Verify read-only access via unreflectSetter and unreflectVarHandle
+     */
+    private static void readOnlyAccessibleObject(Class<?> c, String name, Object o, boolean isFinal) throws Throwable {
+        Field f = c.getDeclaredField(name);
+        int modifier = f.getModifiers();
+        if (isFinal) {
+            assertTrue(Modifier.isFinal(modifier));
+        } else {
+            assertFalse(Modifier.isFinal(modifier));
+        }
+        assertTrue(f.trySetAccessible());
+
+        // Field object with read-only access
+        MethodHandle mh = LOOKUP.unreflectGetter(f);
+        Object value = Modifier.isStatic(modifier) ? mh.invoke() : mh.invoke(o);
+        assertTrue(value == f.get(o));
+        try {
+            LOOKUP.unreflectSetter(f);
+            assertTrue(false, "should fail to unreflect a setter for " + name);
+        } catch (IllegalAccessException e) {
+        }
+
+        VarHandle vh = LOOKUP.unreflectVarHandle(f);
+        if (isFinal) {
+            assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.SET));
+        } else {
+            assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET));
+        }
+    }
+
+    private static void readWriteAccessibleObject(Class<?> c, String name, Object o, boolean isFinal) throws Throwable {
+        Field f = c.getDeclaredField(name);
+        int modifier = f.getModifiers();
+        if (isFinal) {
+            assertTrue(Modifier.isFinal(modifier));
+        } else {
+            assertFalse(Modifier.isFinal(modifier));
+        }
+        assertTrue(f.trySetAccessible());
+
+        // Field object with read-write access
+        MethodHandle mh = MethodHandles.lookup().unreflectGetter(f);
+        Object value = Modifier.isStatic(modifier) ? mh.invoke() : mh.invoke(o);
+        assertTrue(value == f.get(o));
+        try {
+            MethodHandle setter = MethodHandles.lookup().unreflectSetter(f);
+            if (Modifier.isStatic(modifier)) {
+                setter.invokeExact(value);
+            } else {
+                setter.invoke(o, value);
+            }
+        } catch (IllegalAccessException e) {
+            throw e;
+        }
+
+        VarHandle vh = LOOKUP.unreflectVarHandle(f);
+        if (isFinal) {
+            assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.SET));
+        } else {
+            assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.SET));
+        }
+    }
+}
--- a/test/jdk/java/lang/reflect/records/RecordReflectionTest.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/jdk/java/lang/reflect/records/RecordReflectionTest.java	Mon Jun 22 18:23:49 2020 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 8235369 8235550
+ * @bug 8235369 8235550 8247444
  * @summary reflection test for records
  * @compile --enable-preview -source ${jdk.version} RecordReflectionTest.java
  * @run testng/othervm --enable-preview RecordReflectionTest
@@ -187,4 +187,19 @@
         assertEquals(f.getAnnotatedType().getAnnotations().length, 1);
         assertEquals(f.getAnnotatedType().getAnnotations()[0].toString(), annos[0].toString());
     }
+
+    public void testReadOnlyFieldInRecord() throws Throwable {
+        R2 o = new R2(1, 2);
+        Class<?> recordClass = R2.class;
+        String fieldName = "i";
+        Field f = recordClass.getDeclaredField(fieldName);
+        assertTrue(f.trySetAccessible());
+        assertTrue(f.get(o) != null);
+        try {
+            f.set(o, null);
+            assertTrue(false, "should fail to set " + fieldName);
+        } catch (IllegalAccessException e) {
+        }
+    }
+
 }
--- a/test/jdk/sun/misc/UnsafeFieldOffsets.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/jdk/sun/misc/UnsafeFieldOffsets.java	Mon Jun 22 18:23:49 2020 +0200
@@ -22,10 +22,12 @@
  */
 
 /* @test
+ * @bug 8238358 8247444
  * @summary Ensure that sun.misc.Unsafe::objectFieldOffset and staticFieldOffset
- *          throw UnsupportedOperationException on Field of a hidden class
+ *          throw UnsupportedOperationException on Field of a hidden or record class
  * @modules jdk.unsupported
- * @run main UnsafeFieldOffsets
+ * @compile --enable-preview -source ${jdk.version} UnsafeFieldOffsets.java
+ * @run testng/othervm --enable-preview UnsafeFieldOffsets
  */
 
 import sun.misc.Unsafe;
@@ -38,6 +40,9 @@
 import java.nio.file.Path;
 import java.nio.file.Paths;
 
+import org.testng.annotations.Test;
+import static org.testng.Assert.*;
+
 public class UnsafeFieldOffsets {
     static class Fields {
         static final Object STATIC_FINAL = new Object();
@@ -45,9 +50,14 @@
         final Object FINAL = new Object();
         Object NON_FINAL = new Object();
     }
+    record TestRecord(int i) {
+        static final Object STATIC_FINAL = new Object();
+        static Object STATIC_NON_FINAL = new Object();
+    }
 
     private static Unsafe UNSAFE = getUnsafe();
     private static final Class<?> HIDDEN_CLASS = defineHiddenClass();
+    private static final Class<?> RECORD_CLASS = TestRecord.class;
 
     private static Unsafe getUnsafe() {
         try {
@@ -65,7 +75,7 @@
         try {
             byte[] bytes = Files.readAllBytes(cf);
             Class<?> c = MethodHandles.lookup().defineHiddenClass(bytes, true).lookupClass();
-            assertHiddenClass(c);
+            assertTrue(c.isHidden());
             return c;
         } catch (IOException e) {
             throw new UncheckedIOException(e);
@@ -74,13 +84,17 @@
         }
     }
 
-    public static void main(String[] args) throws Exception {
-        // non-hidden class
-        testStaticField(Fields.class, "STATIC_FINAL");
-        testStaticField(Fields.class, "STATIC_NON_FINAL");
-        testInstanceField(Fields.class, "FINAL");
-        testInstanceField(Fields.class, "NON_FINAL");
+    @Test
+    public void testNormalClass() throws Throwable {
+        // hidden class
+        testStaticField(HIDDEN_CLASS, "STATIC_FINAL");
+        testStaticField(HIDDEN_CLASS, "STATIC_NON_FINAL");
+        testInstanceField(HIDDEN_CLASS, "FINAL");
+        testInstanceField(HIDDEN_CLASS, "NON_FINAL");
+    }
 
+    @Test
+    public void testHiddenClass() throws Throwable {
         // hidden class
         testStaticField(HIDDEN_CLASS, "STATIC_FINAL");
         testStaticField(HIDDEN_CLASS, "STATIC_NON_FINAL");
@@ -88,13 +102,21 @@
         testInstanceField(HIDDEN_CLASS, "NON_FINAL");
     }
 
+    @Test
+    public void testRecordClass() throws Throwable {
+        // record class
+        testRecordStaticField(RECORD_CLASS, "STATIC_FINAL");
+        testRecordStaticField(RECORD_CLASS, "STATIC_NON_FINAL");
+        testRecordInstanceField(RECORD_CLASS, "i");
+    }
+
     private static void testStaticField(Class<?> c, String name) throws Exception {
         Field f = c.getDeclaredField(name);
         try {
             UNSAFE.staticFieldOffset(f);
-            assertNonHiddenClass(c);
+            assertFalse(c.isHidden(), "Expected UOE thrown: " + c);
         } catch (UnsupportedOperationException e) {
-            assertHiddenClass(c);
+            assertTrue(c.isHidden(), "Expected hidden class: " + c);
         }
     }
 
@@ -102,19 +124,31 @@
         Field f = c.getDeclaredField(name);
         try {
             UNSAFE.objectFieldOffset(f);
-            assertNonHiddenClass(c);
+            assertFalse(c.isHidden(), "Expected UOE thrown: " + c);
         } catch (UnsupportedOperationException e) {
-            assertHiddenClass(c);
+            assertTrue(c.isHidden(), "Expected hidden class: " + c);
         }
     }
 
-    private static void assertNonHiddenClass(Class<?> c) {
-        if (c.isHidden())
-            throw new RuntimeException("Expected UOE but not thrown: " + c);
+    @SuppressWarnings("preview")
+    private static void testRecordStaticField(Class<?> c, String name) throws Exception {
+        Field f = c.getDeclaredField(name);
+        try {
+            UNSAFE.staticFieldOffset(f);
+            assertFalse(c.isRecord(), "Expected UOE thrown: " + c);
+        } catch (UnsupportedOperationException e) {
+            assertTrue(c.isRecord(), "Expected record class: " + c);
+        }
     }
 
-    private static void assertHiddenClass(Class<?> c) {
-        if (!c.isHidden())
-            throw new RuntimeException("Expected hidden class but is not: " + c);
+    @SuppressWarnings("preview")
+    private static void testRecordInstanceField(Class<?> c, String name) throws Exception {
+        Field f = c.getDeclaredField(name);
+        try {
+            UNSAFE.objectFieldOffset(f);
+            assertFalse(c.isRecord(), "Expected UOE thrown: " + c);
+        } catch (UnsupportedOperationException e) {
+            assertTrue(c.isRecord(), "Expected record class: " + c);
+        }
     }
 }
--- a/test/langtools/jdk/javadoc/doclet/testDeprecatedDocs/TestDeprecatedDocs.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/jdk/javadoc/doclet/testDeprecatedDocs/TestDeprecatedDocs.java	Mon Jun 22 18:23:49 2020 +0200
@@ -24,7 +24,7 @@
 /*
  * @test
  * @bug      4927552 8026567 8071982 8162674 8175200 8175218 8183511 8186332
- *           8169819 8074407 8191030 8182765 8184205
+ *           8169819 8074407 8191030 8182765 8184205 8243533
  * @summary  test generated docs for deprecated items
  * @library  ../../lib
  * @modules jdk.javadoc/jdk.javadoc.internal.tool
@@ -164,8 +164,27 @@
                     </td>""",
                 """
                     <td class="col-last">
+                    <div class="block"><span class="deprecated-label">Deprecated, for removal: This \
+                    API element is subject to removal in a future version.</span>
+                    <div class="deprecation-comment">class_test4 passes.</div>
+                    </div>
+                    </td>""",
+                """
+                    <td class="col-last">
                     <div class="block"><span class="deprecated-label">Deprecated.</span>
-                    <div class="deprecation-comment">class_test4 passes.</div>
+                    <div class="deprecation-comment">class_test5 passes.</div>
+                    </div>
+                    </td>""",
+                """
+                    <td class="col-last">
+                    <div class="block"><span class="deprecated-label">Deprecated.</span>
+                    <div class="deprecation-comment">class_test6 passes.</div>
+                    </div>
+                    </td>""",
+                """
+                    <td class="col-last">
+                    <div class="block"><span class="deprecated-label">Deprecated.</span>
+                    <div class="deprecation-comment">class_test7 passes.</div>
                     </div>
                     </td>""");
 
@@ -355,6 +374,78 @@
                     </tr>
                     </tbody>
                     </table>
-                    </div>""");
+                    </div>""",
+                """
+                    <div class="deprecated-summary" id="method">
+                    <table class="summary-table">
+                    <caption><span>Methods</span></caption>
+                    <thead>
+                    <tr>
+                    <th class="col-first" scope="col">Method</th>
+                    <th class="col-last" scope="col">Description</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr class="alt-color">
+                    <th class="col-deprecated-item-name" scope="row"><a href="pkg/DeprecatedClassByAnnotation.html#method()">pkg.DeprecatedClassByAnnotation.method()</a></th>
+                    <td class="col-last"></td>
+                    </tr>
+                    <tr class="row-color">
+                    <th class="col-deprecated-item-name" scope="row"><a href="pkg/TestAnnotationType.html#optional()">pkg.TestAnnotationType.optional()</a></th>
+                    <td class="col-last">
+                    <div class="deprecation-comment">annotation_test2 passes.</div>
+                    </td>
+                    </tr>
+                    <tr class="alt-color">
+                    <th class="col-deprecated-item-name" scope="row"><a href="pkg/TestAnnotationType.html#required()">pkg.TestAnnotationType.required()</a></th>
+                    <td class="col-last">
+                    <div class="deprecation-comment">annotation_test3 passes.</div>
+                    </td>
+                    </tr>
+                    <tr class="row-color">
+                    <th class="col-deprecated-item-name" scope="row"><a href="pkg/TestClass.html#method()">pkg.TestClass.method()</a></th>
+                    <td class="col-last">
+                    <div class="deprecation-comment">class_test5 passes. This is the second sentence of deprecated description for a method.</div>
+                    </td>
+                    </tr>
+                    <tr class="alt-color">
+                    <th class="col-deprecated-item-name" scope="row"><a href="pkg/TestClass.html#overloadedMethod(int)">pkg.TestClass.overloadedMethod&#8203;(int)</a></th>
+                    <td class="col-last">
+                    <div class="deprecation-comment">class_test7 passes. Overloaded method 2.</div>
+                    </td>
+                    </tr>
+                    <tr class="row-color">
+                    <th class="col-deprecated-item-name" scope="row"><a href="pkg/TestClass.html#overloadedMethod(java.lang.String)">pkg.TestClass.overloadedMethod&#8203;(String)</a></th>
+                    <td class="col-last">
+                    <div class="deprecation-comment">class_test6 passes. Overloaded method 1.</div>
+                    </td>
+                    </tr>""",
+                """
+                    <div class="deprecated-summary" id="constructor">
+                    <table class="summary-table">
+                    <caption><span>Constructors</span></caption>
+                    <thead>
+                    <tr>
+                    <th class="col-first" scope="col">Constructor</th>
+                    <th class="col-last" scope="col">Description</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr class="alt-color">
+                    <th class="col-deprecated-item-name" scope="row"><a href="pkg/DeprecatedClassByAnnotation.html#%3Cinit%3E()">pkg.DeprecatedClassByAnnotation()</a></th>
+                    <td class="col-last"></td>
+                    </tr>
+                    <tr class="row-color">
+                    <th class="col-deprecated-item-name" scope="row"><a href="pkg/TestClass.html#%3Cinit%3E()">pkg.TestClass()</a></th>
+                    <td class="col-last">
+                    <div class="deprecation-comment">class_test3 passes. This is the second sentence of deprecated description for a constructor.</div>
+                    </td>
+                    </tr>
+                    <tr class="alt-color">
+                    <th class="col-deprecated-item-name" scope="row"><a href="pkg/TestClass.html#%3Cinit%3E(java.lang.String)">pkg.TestClass&#8203;(String)</a></th>
+                    <td class="col-last">
+                    <div class="deprecation-comment">class_test4 passes. Overloaded constructor.</div>
+                    </td>
+                    </tr>""");
     }
 }
--- a/test/langtools/jdk/javadoc/doclet/testDeprecatedDocs/pkg/TestClass.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/jdk/javadoc/doclet/testDeprecatedDocs/pkg/TestClass.java	Mon Jun 22 18:23:49 2020 +0200
@@ -41,7 +41,23 @@
     public TestClass() {}
 
     /**
-     * @deprecated class_test4 passes. This is the second sentence of deprecated description for a method.
+     * @deprecated class_test4 passes. Overloaded constructor.
+     */
+    @Deprecated(forRemoval=true)
+    public TestClass(String s) {}
+
+    /**
+     * @deprecated class_test5 passes. This is the second sentence of deprecated description for a method.
      */
     public void method() {}
+
+    /**
+     * @deprecated class_test6 passes. Overloaded method 1.
+     */
+    public void overloadedMethod(String s) {}
+
+    /**
+     * @deprecated class_test7 passes. Overloaded method 2.
+     */
+    public void overloadedMethod(int i) {}
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/jdk/javadoc/doclet/testHelpPage/TestHelpPage.java	Mon Jun 22 18:23:49 2020 +0200
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8246078
+ * @library ../../lib
+ * @modules jdk.javadoc/jdk.javadoc.internal.tool
+ * @build javadoc.tester.*
+ * @run main TestHelpPage
+ */
+
+import javadoc.tester.JavadocTester;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class TestHelpPage extends JavadocTester {
+
+    public static void main(String... args) throws Exception {
+        TestHelpPage tester = new TestHelpPage();
+        tester.runTests();
+    }
+
+    @Test
+    public void test() {
+
+        setOutputDirectoryCheck(DirectoryCheck.NONE);
+        setAutomaticCheckLinks(false);
+        setAutomaticCheckAccessibility(false);
+
+        javadoc("--version");
+        List<String> lines = getOutputLines(Output.OUT);
+        System.out.println("lines: " + Arrays.toString(lines.toArray()));
+        String firstLine = lines.get(0);
+        Matcher m = Pattern.compile("javadoc\\s+(.*)").matcher(firstLine);
+        m.matches();
+        String vstr = m.group(1);
+        System.out.printf("vstr='%s'%n", vstr);
+        Runtime.Version v = Runtime.Version.parse(vstr);
+        System.out.printf("v=%s, v.feature()=%s%n", v, v.feature());
+
+        javadoc("-d", "out",
+                "-sourcepath", testSrc,
+                testSrc("TestHelpPage.java"));
+        checkExit(Exit.OK);
+
+        checking("Reference to a particular version");
+        Pattern searchSpecLink = Pattern.compile(
+                "\\Q<a href=\"https://docs.oracle.com/en/java/javase/\\E(\\d+)\\Q/docs/specs/javadoc/javadoc-search-spec.html\">\\E");
+
+        String helpContents = readOutputFile("help-doc.html");
+        Matcher m2 = searchSpecLink.matcher(helpContents);
+        if (!m2.find()) {
+            failed("Reference not found: " + helpContents);
+            return;
+        }
+
+        if (!String.valueOf(v.feature()).equals(m2.group(1))) {
+            failed("Reference to a wrong version: " + m2.group(1));
+            return;
+        }
+
+        boolean foundMore = false;
+        while (m2.find()) {
+            // print all found before failing
+            foundMore = true;
+            System.out.println(m2.group(0));
+        }
+        if (foundMore) {
+            failed("Multiple references: " + helpContents);
+        } else {
+            passed("All good");
+        }
+    }
+}
--- a/test/langtools/jdk/javadoc/doclet/testModules/TestModulePackages.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/jdk/javadoc/doclet/testModules/TestModulePackages.java	Mon Jun 22 18:23:49 2020 +0200
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 8178070 8196201 8184205 8246429
+ * @bug 8178070 8196201 8184205 8246429 8198705
  * @summary Test packages table in module summary pages
  * @library /tools/lib ../../lib
  * @modules jdk.compiler/com.sun.tools.javac.api
@@ -167,6 +167,14 @@
                     <div class="sub-title"><span class="module-label-in-type">Module</span>&nbsp;<a href="../module-summary.html">o</a></div>
                     <div class="sub-title"><span class="package-label-in-type">Package</span>&nbsp;<a href="package-summary.html">p</a></div>
                     """);
+        checkOutput("type-search-index.js", true,
+                """
+                     {"p":"p","m":"m","l":"C"},{"p":"p","m":"o","l":"C"}""");
+        checkOutput("member-search-index.js", true,
+                """
+                     {"m":"m","p":"p","c":"C","l":"C()","u":"%3Cinit%3E()"}""",
+                """
+                     {"m":"o","p":"p","c":"C","l":"C()","u":"%3Cinit%3E()"}""");
     }
 
     @Test
--- a/test/langtools/jdk/javadoc/doclet/testSearch/TestSearch.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/jdk/javadoc/doclet/testSearch/TestSearch.java	Mon Jun 22 18:23:49 2020 +0200
@@ -726,14 +726,16 @@
                             return ui.item.l + slash;
                         } else if (ui.item.category === catPackages && ui.item.m) {
                             return ui.item.m + slash;
-                        } else if ((ui.item.category === catTypes && ui.item.p) || ui.item.category === catMembers) {
-                            $.each(packageSearchIndex, function(index, item) {
-                                if (item.m && ui.item.p == item.l) {
-                                    urlPrefix = item.m + slash;
-                                }
-                            });
-                            return urlPrefix;
-                        } else {
+                        } else if (ui.item.category === catTypes || ui.item.category === catMembers) {
+                            if (ui.item.m) {
+                                urlPrefix = ui.item.m + slash;
+                            } else {
+                                $.each(packageSearchIndex, function(index, item) {
+                                    if (item.m && ui.item.p === item.l) {
+                                        urlPrefix = item.m + slash;
+                                    }
+                                });
+                            }
                             return urlPrefix;
                         }
                         return urlPrefix;
--- a/test/langtools/jdk/javadoc/doclet/testTypeAnnotations/TestTypeAnnotations.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/jdk/javadoc/doclet/testTypeAnnotations/TestTypeAnnotations.java	Mon Jun 22 18:23:49 2020 +0200
@@ -24,7 +24,7 @@
 /*
  * @test
  * @bug      8005091 8009686 8025633 8026567 6469562 8071982 8071984 8162363 8175200 8186332 8182765
- *           8187288
+ *           8187288 8241969
  * @summary  Make sure that type annotations are displayed correctly
  * @library  ../../lib
  * @modules jdk.javadoc/jdk.javadoc.internal.tool
@@ -335,6 +335,35 @@
                     tation in typeannos">@WldB</a>("m") java.lang.String&gt;</span>&nbsp;<span class\
                     ="member-name">returnWcExtends</span>()</div>""");
 
+        checkOutput("typeannos/SelfTest.html", true,
+                """
+                    <div class="member-signature"><span class="return-type"><a href="MyList.html" ti\
+                    tle="class in typeannos">MyList</a>&lt;<a href="WldA.html" title="annotation in \
+                    typeannos">@WldA</a> ?&gt;</span>&nbsp;<span class="member-name">returnWcExtends\
+                    </span>()</div>""",
+                """
+                    <div class="member-signature"><span class="return-type"><a href="MyList.html" ti\
+                    tle="class in typeannos">MyList</a>&lt;<a href="WldA.html" title="annotation in \
+                    typeannos">@WldA</a> ? extends <a href="WldA.html" title="annotation in typeanno\
+                    s">@WldA</a> <a href="MyList.html" title="class in typeannos">MyList</a>&lt;<a h\
+                    ref="WldB.html" title="annotation in typeannos">@WldB</a>("m") ?&gt;&gt;</span>&\
+                    nbsp;<span class="member-name">complex</span>()</div>""");
+
+        checkOutput("typeannos/SelfWithValue.html", true,
+                """
+                    <div class="member-signature"><span class="return-type"><a href="MyList.html" ti\
+                    tle="class in typeannos">MyList</a>&lt;<a href="WldB.html" title="annotation in \
+                    typeannos">@WldB</a>("m") ?&gt;</span>&nbsp;<span class="member-name">returnWcEx\
+                    tends</span>()</div>""",
+                """
+                    <div class="member-signature"><span class="return-type"><a href="MyList.html" ti\
+                    tle="class in typeannos">MyList</a>&lt;<a href="WldB.html" title="annotation in \
+                    typeannos">@WldB</a>("m") ? extends <a href="MyList.html" title="class in typean\
+                    nos">MyList</a>&lt;<a href="WldB.html" title="annotation in typeannos">@WldB</a>\
+                    ("m") ? super java.lang.String&gt;&gt;</span>&nbsp;<span class="member-name">com\
+                    plex</span>()</div>""");
+
+
         // Test for receiver annotations (Receivers.java).
         checkOutput("typeannos/DefaultUnmodified.html", true,
                 """
--- a/test/langtools/jdk/javadoc/tool/doclint/DocLintTest.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/jdk/javadoc/tool/doclint/DocLintTest.java	Mon Jun 22 18:23:49 2020 +0200
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 8004834 8007610 8129909 8182765
+ * @bug 8004834 8007610 8129909 8182765 8247815
  * @summary Add doclint support into javadoc
  * @modules jdk.compiler/com.sun.tools.javac.main
  */
@@ -178,7 +178,7 @@
                     Main.Result.OK,
                     EnumSet.of(Message.DL_WRN12));
 
-            test(List.of(htmlVersion, rawDiags, "-Xdoclint:syntax"),
+            test(List.of(htmlVersion, rawDiags, "-Xdoclint:missing"),
                     Main.Result.OK,
                     EnumSet.of(Message.DL_WRN12));
 
@@ -186,7 +186,7 @@
                     Main.Result.ERROR,
                     EnumSet.of(Message.DL_ERR6, Message.DL_ERR9, Message.DL_WRN12));
 
-            test(List.of(htmlVersion, rawDiags, "-Xdoclint:syntax", "-private"),
+            test(List.of(htmlVersion, rawDiags, "-Xdoclint:missing,syntax", "-private"),
                     Main.Result.ERROR,
                     EnumSet.of(Message.DL_ERR6, Message.DL_WRN12));
 
--- a/test/langtools/jdk/jshell/IndentUITest.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/jdk/jshell/IndentUITest.java	Mon Jun 22 18:23:49 2020 +0200
@@ -23,7 +23,7 @@
 
 /**
  * @test
- * @bug 8241950
+ * @bug 8241950 8247932
  * @summary Check the UI behavior of indentation
  * @library /tools/lib
  * @modules
@@ -70,6 +70,11 @@
             waitOutput(out, "^void test2\\(\\) \\{\n" +
                             CONTINUATION_PROMPT + "  System.err.println\\(1\\);\n" +
                             CONTINUATION_PROMPT + "\\}");
+            inputSink.write(INTERRUPT);
+            waitOutput(out, "\u001B\\[\\?2004h" + PROMPT);
+            inputSink.write("\"\"\"\n");
+            waitOutput(out, "^\"\"\"\n" +
+                            CONTINUATION_PROMPT);
         });
     }
 
--- a/test/langtools/jdk/jshell/ToolSimpleTest.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/jdk/jshell/ToolSimpleTest.java	Mon Jun 22 18:23:49 2020 +0200
@@ -132,7 +132,7 @@
                         + "|  Caused by: java.io.IOException: bar\n"
                         + "|        at n (#2:1)\n"
                         + "|        ...\n"
-                        + "|  Caused by: java.lang.NullPointerException\n"
+                        + "|  Caused by: java.lang.NullPointerException: Cannot invoke \"String.toString()\" because \"null\" is null\n"
                         + "|        at p (#1:1)\n"
                         + "|        ..."),
                 (a) -> assertCommand(a, "/drop p",
--- a/test/langtools/tools/doclint/EmptyAuthorTest.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/tools/doclint/EmptyAuthorTest.java	Mon Jun 22 18:23:49 2020 +0200
@@ -1,11 +1,11 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 8004832
+ * @bug 8004832 8247815
  * @summary Add new doclint package
  * @modules jdk.compiler/com.sun.tools.doclint
  * @build DocLintTester
- * @run main DocLintTester -Xmsgs:-syntax EmptyAuthorTest.java
- * @run main DocLintTester -Xmsgs:syntax -ref EmptyAuthorTest.out EmptyAuthorTest.java
+ * @run main DocLintTester -Xmsgs:-missing EmptyAuthorTest.java
+ * @run main DocLintTester -Xmsgs:missing -ref EmptyAuthorTest.out EmptyAuthorTest.java
  */
 
 /** @author */
--- a/test/langtools/tools/doclint/EmptyExceptionTest.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/tools/doclint/EmptyExceptionTest.java	Mon Jun 22 18:23:49 2020 +0200
@@ -1,15 +1,15 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 8004832
+ * @bug 8004832 8247815
  * @summary Add new doclint package
  * @modules jdk.compiler/com.sun.tools.doclint
  * @build DocLintTester
- * @run main DocLintTester -Xmsgs:-syntax EmptyExceptionTest.java
- * @run main DocLintTester -Xmsgs:syntax -ref EmptyExceptionTest.out EmptyExceptionTest.java
+ * @run main DocLintTester -Xmsgs:-missing EmptyExceptionTest.java
+ * @run main DocLintTester -Xmsgs:missing -ref EmptyExceptionTest.out EmptyExceptionTest.java
  */
 
 /** . */
 public class EmptyExceptionTest {
     /** @exception NullPointerException */
-    int emptyException() throws NullPointerException { }
+    void emptyException() throws NullPointerException { }
 }
--- a/test/langtools/tools/doclint/EmptyParamTest.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/tools/doclint/EmptyParamTest.java	Mon Jun 22 18:23:49 2020 +0200
@@ -1,15 +1,15 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 8004832
+ * @bug 8004832 8247815
  * @summary Add new doclint package
  * @modules jdk.compiler/com.sun.tools.doclint
  * @build DocLintTester
- * @run main DocLintTester -Xmsgs:-syntax EmptyParamTest.java
- * @run main DocLintTester -Xmsgs:syntax -ref EmptyParamTest.out EmptyParamTest.java
+ * @run main DocLintTester -Xmsgs:-missing EmptyParamTest.java
+ * @run main DocLintTester -Xmsgs:missing -ref EmptyParamTest.out EmptyParamTest.java
  */
 
 /** . */
 public class EmptyParamTest {
     /** @param i */
-    int emptyParam(int i) { }
+    void emptyParam(int i) { }
 }
--- a/test/langtools/tools/doclint/EmptyReturnTest.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/tools/doclint/EmptyReturnTest.java	Mon Jun 22 18:23:49 2020 +0200
@@ -1,15 +1,15 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 8004832
+ * @bug 8004832 8247815
  * @summary Add new doclint package
  * @modules jdk.compiler/com.sun.tools.doclint
  * @build DocLintTester
- * @run main DocLintTester -Xmsgs:-syntax EmptyReturnTest.java
- * @run main DocLintTester -Xmsgs:syntax -ref EmptyReturnTest.out EmptyReturnTest.java
+ * @run main DocLintTester -Xmsgs:-missing EmptyReturnTest.java
+ * @run main DocLintTester -Xmsgs:missing -ref EmptyReturnTest.out EmptyReturnTest.java
  */
 
 /** . */
 public class EmptyReturnTest {
     /** @return */
-    int emptyReturn() { }
+    int emptyReturn() { return 0; }
 }
--- a/test/langtools/tools/doclint/EmptySerialDataTest.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/tools/doclint/EmptySerialDataTest.java	Mon Jun 22 18:23:49 2020 +0200
@@ -1,11 +1,11 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 8004832
+ * @bug 8004832 8247815
  * @summary Add new doclint package
  * @modules jdk.compiler/com.sun.tools.doclint
  * @build DocLintTester
- * @run main DocLintTester -Xmsgs:-syntax EmptySerialDataTest.java
- * @run main DocLintTester -Xmsgs:syntax -ref EmptySerialDataTest.out EmptySerialDataTest.java
+ * @run main DocLintTester -Xmsgs:-missing EmptySerialDataTest.java
+ * @run main DocLintTester -Xmsgs:missing -ref EmptySerialDataTest.out EmptySerialDataTest.java
  */
 
 import java.io.ObjectOutputStream;
@@ -13,6 +13,10 @@
 
 /** . */
 public class EmptySerialDataTest implements Serializable {
-    /** @serialData */
+    /**
+     * .
+     * @serialData
+     * @param s .
+     */
     private void writeObject(ObjectOutputStream s) { }
 }
--- a/test/langtools/tools/doclint/EmptySerialDataTest.out	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/tools/doclint/EmptySerialDataTest.out	Mon Jun 22 18:23:49 2020 +0200
@@ -1,5 +1,5 @@
-EmptySerialDataTest.java:16: warning: no description for @serialData
-    /** @serialData */
-        ^
+EmptySerialDataTest.java:18: warning: no description for @serialData
+     * @serialData
+       ^
 1 warning
 
--- a/test/langtools/tools/doclint/EmptySerialFieldTest.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/tools/doclint/EmptySerialFieldTest.java	Mon Jun 22 18:23:49 2020 +0200
@@ -1,11 +1,11 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 8004832
+ * @bug 8004832 8247815
  * @summary Add new doclint package
  * @modules jdk.compiler/com.sun.tools.doclint
  * @build DocLintTester
- * @run main DocLintTester -Xmsgs:-syntax EmptySerialFieldTest.java
- * @run main DocLintTester -Xmsgs:syntax -ref EmptySerialFieldTest.out EmptySerialFieldTest.java
+ * @run main DocLintTester -Xmsgs:-missing EmptySerialFieldTest.java
+ * @run main DocLintTester -Xmsgs:missing -ref EmptySerialFieldTest.out EmptySerialFieldTest.java
  */
 
 import java.io.ObjectStreamField;
--- a/test/langtools/tools/doclint/EmptySinceTest.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/tools/doclint/EmptySinceTest.java	Mon Jun 22 18:23:49 2020 +0200
@@ -1,15 +1,15 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 8004832
+ * @bug 8004832 8247815
  * @summary Add new doclint package
  * @modules jdk.compiler/com.sun.tools.doclint
  * @build DocLintTester
- * @run main DocLintTester -Xmsgs:-syntax EmptySinceTest.java
- * @run main DocLintTester -Xmsgs:syntax -ref EmptySinceTest.out EmptySinceTest.java
+ * @run main DocLintTester -Xmsgs:-missing EmptySinceTest.java
+ * @run main DocLintTester -Xmsgs:missing -ref EmptySinceTest.out EmptySinceTest.java
  */
 
 /** . */
 public class EmptySinceTest {
     /** @since */
-    int emptySince() { }
+    void emptySince() { }
 }
--- a/test/langtools/tools/doclint/EmptyVersionTest.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/tools/doclint/EmptyVersionTest.java	Mon Jun 22 18:23:49 2020 +0200
@@ -1,15 +1,15 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 8004832
+ * @bug 8004832 8247815
  * @summary Add new doclint package
  * @modules jdk.compiler/com.sun.tools.doclint
  * @build DocLintTester
- * @run main DocLintTester -Xmsgs:-syntax EmptyVersionTest.java
- * @run main DocLintTester -Xmsgs:syntax -ref EmptyVersionTest.out EmptyVersionTest.java
+ * @run main DocLintTester -Xmsgs:-missing EmptyVersionTest.java
+ * @run main DocLintTester -Xmsgs:missing -ref EmptyVersionTest.out EmptyVersionTest.java
  */
 
 /** . */
 public class EmptyVersionTest {
     /** @version */
-    int missingVersion() { }
+    void missingVersion() { }
 }
--- a/test/langtools/tools/doclint/MultipleDocLintOptionsTest.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/tools/doclint/MultipleDocLintOptionsTest.java	Mon Jun 22 18:23:49 2020 +0200
@@ -1,8 +1,8 @@
 /*
  * @test /nodynamiccopyright/
- * @bug 8198552
+ * @bug 8198552 8247815
  * @summary Check that -Xdoclint: option can be specified multiple times
- * @compile/fail/ref=MultipleDocLintOptionsTest.out -Xdoclint:html -Xdoclint:syntax -XDrawDiagnostics MultipleDocLintOptionsTest.java
+ * @compile/fail/ref=MultipleDocLintOptionsTest.out -Xdoclint:html -Xdoclint:missing -XDrawDiagnostics MultipleDocLintOptionsTest.java
  */
 
 /** <html> */
--- a/test/langtools/tools/javac/doclint/DocLintTest.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/tools/javac/doclint/DocLintTest.java	Mon Jun 22 18:23:49 2020 +0200
@@ -135,7 +135,7 @@
                     Main.Result.OK,
                     EnumSet.of(Message.DL_WRN12));
 
-            test(Arrays.asList(rawDiags, "-Xdoclint:syntax"),
+            test(Arrays.asList(rawDiags, "-Xdoclint:syntax,missing"),
                     Main.Result.ERROR,
                     EnumSet.of(Message.DL_ERR6, Message.DL_WRN12));
 
--- a/test/langtools/tools/javac/lambda/methodReference/ProtectedInaccessibleMethodRefTest2.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/tools/javac/lambda/methodReference/ProtectedInaccessibleMethodRefTest2.java	Mon Jun 22 18:23:49 2020 +0200
@@ -23,45 +23,58 @@
 
 /*
  * @test
- * @bug 8234729
+ * @bug 8234729 8242214
  * @summary Javac should eagerly change code generation for method references to avert IllegalAccessError in future.
+ * @compile ProtectedInaccessibleMethodRefTest2.java
  * @run main ProtectedInaccessibleMethodRefTest2
  */
 
 import pack.I;
 import pack.J;
 
+import java.lang.reflect.Method;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.function.Function;
-import java.lang.reflect.Method;
-import java.util.concurrent.Callable;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.function.BiFunction;
 
 public final class ProtectedInaccessibleMethodRefTest2 extends I {
 
     public static void main(String... args) {
         ProtectedInaccessibleMethodRefTest2 m = new ProtectedInaccessibleMethodRefTest2();
         m.test(Paths.get("test"));
-        // Verify that the method reference has been folded into a lambda.
-        boolean lambdaFound = false;
+        // Verify that the method references have been folded into lambdas:
+        Set<String> methodNames = new HashSet<>();
         for (Method meth : ProtectedInaccessibleMethodRefTest2.class.getDeclaredMethods()) {
-            if (meth.getName().equals("lambda$test$0")) {
-                lambdaFound = true;
-                break;
-            }
+            methodNames.add(meth.getName());
         }
-        if (!lambdaFound) {
+        List<String> expectedMethods =
+                Arrays.asList("lambda$test$0", "lambda$test$1", "lambda$test$2");
+        if (!methodNames.containsAll(expectedMethods)) {
             throw new AssertionError("Did not find evidence of new code generation");
         }
     }
 
     void test(Path outputDir) {
-        Sub c = new Sub(this::readFile);
-        c.check(outputDir);
+        Sub c1 = new Sub(this::readFile);
+        c1.check(outputDir);
+        Sub c2 = new Sub(ProtectedInaccessibleMethodRefTest2::readFile, this);
+        c2.check(outputDir);
+        Sub c3 = new Sub(ProtectedInaccessibleMethodRefTest2::readFile2);
+        c3.check(outputDir);
     }
+
     public class Sub extends J {
         Sub(Function<Path,String> fileReader) {
             super(fileReader);
         }
+        Sub(BiFunction<ProtectedInaccessibleMethodRefTest2, Path,String> fileReader,
+            ProtectedInaccessibleMethodRefTest2 instance) {
+            super(p -> fileReader.apply(instance, p));
+        }
     }
 }
--- a/test/langtools/tools/javac/lambda/methodReference/pack/I.java	Mon Jun 22 11:40:06 2020 -0400
+++ b/test/langtools/tools/javac/lambda/methodReference/pack/I.java	Mon Jun 22 18:23:49 2020 +0200
@@ -29,4 +29,8 @@
     protected String readFile(Path file) {
         return file.toString();
     }
+
+    protected static String readFile2(Path file) {
+        return file.toString();
+    }
 }