--- old/src/hotspot/share/oops/objArrayKlass.cpp 2018-06-03 14:16:06.407125199 +0200 +++ new/src/hotspot/share/oops/objArrayKlass.cpp 2018-06-03 14:16:06.011132063 +0200 @@ -223,18 +223,18 @@ if (oopDesc::equals(s, d)) { // since source and destination are equal we do not need conversion checks. assert(length > 0, "sanity check"); - ArrayAccess<>::oop_arraycopy(s, src_offset, d, dst_offset, length); + ArrayAccess<>::template oop_arraycopy(s, src_offset, d, dst_offset, length); } else { // We have to make sure all elements conform to the destination array Klass* bound = ObjArrayKlass::cast(d->klass())->element_klass(); Klass* stype = ObjArrayKlass::cast(s->klass())->element_klass(); if (stype == bound || stype->is_subtype_of(bound)) { // elements are guaranteed to be subtypes, so no check necessary - ArrayAccess::oop_arraycopy(s, src_offset, d, dst_offset, length); + ArrayAccess::template oop_arraycopy(s, src_offset, d, dst_offset, length); } else { // slow case: need individual subtype checks // note: don't use obj_at_put below because it includes a redundant store check - if (!ArrayAccess::oop_arraycopy(s, src_offset, d, dst_offset, length)) { + if (!ArrayAccess::template oop_arraycopy(s, src_offset, d, dst_offset, length)) { THROW(vmSymbols::java_lang_ArrayStoreException()); } }