From c4b3d62c7fbf9567404be28eaf9635bad435e06b Mon Sep 17 00:00:00 2001 From: Yoshiki Sato Date: Wed, 29 Sep 2021 13:04:44 +0000 Subject: [PATCH] 8273924: ArrayIndexOutOfBoundsException thrown in java.util.JapaneseImperialCalendar.add() Backport-of: d39aad92308fbc28bd2de164e331062ebf62da85 --- .../sun/util/calendar/BaseCalendar.java | 6 +++++- .../CalendarTestScripts/JapaneseTests.java | 2 +- .../japanese/japanese_add.cts | 20 +++++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/java.base/share/classes/sun/util/calendar/BaseCalendar.java b/src/java.base/share/classes/sun/util/calendar/BaseCalendar.java index 3c07431274c..8a7ffc6344d 100644 --- a/src/java.base/share/classes/sun/util/calendar/BaseCalendar.java +++ b/src/java.base/share/classes/sun/util/calendar/BaseCalendar.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2021, 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 @@ -277,6 +277,10 @@ void normalizeMonth(CalendarDate date) { long xm = 1L - month; year -= (int)((xm / 12) + 1); month = 13 - (xm % 12); + if (month == 13) { + year++; + month = 1; + } bdate.setNormalizedYear(year); bdate.setMonth((int) month); } else if (month > DECEMBER) { diff --git a/test/jdk/java/util/Calendar/CalendarTestScripts/JapaneseTests.java b/test/jdk/java/util/Calendar/CalendarTestScripts/JapaneseTests.java index 403e483affa..4f21b33baaa 100644 --- a/test/jdk/java/util/Calendar/CalendarTestScripts/JapaneseTests.java +++ b/test/jdk/java/util/Calendar/CalendarTestScripts/JapaneseTests.java @@ -24,7 +24,7 @@ /* * @test * @summary tests Japanese Calendar. - * @bug 4609228 8187649 + * @bug 4609228 8187649 8273924 * @modules java.base/sun.util * java.base/sun.util.calendar * @compile diff --git a/test/jdk/java/util/Calendar/CalendarTestScripts/japanese/japanese_add.cts b/test/jdk/java/util/Calendar/CalendarTestScripts/japanese/japanese_add.cts index b698b785815..c0f6be479a1 100644 --- a/test/jdk/java/util/Calendar/CalendarTestScripts/japanese/japanese_add.cts +++ b/test/jdk/java/util/Calendar/CalendarTestScripts/japanese/japanese_add.cts @@ -354,6 +354,26 @@ test add MONTH # check date Heisei $max Aug 16 # check timeofday 23 59 59 999 +# JDK-8273924 + set date Reiwa 2 Mar 1 + add month -10 + check date Reiwa 1 May 1 + set date Reiwa 2 Mar 1 + add month -11 + check date Heisei 31 Apr 1 + set date Reiwa 2 Mar 1 + add month -12 + check date Heisei 31 Mar 1 + set date Reiwa 2 Mar 1 + add month -13 + check date Heisei 31 Feb 1 + set date Reiwa 2 Mar 1 + add month -14 + check date Heisei 31 Jan 1 + set date Reiwa 2 Mar 1 + add month -15 + check date Heisei 30 Dec 1 + test add WEEK_OF_YEAR use jcal clear all