On Wed, 8 Jul 2026 18:22:36 GMT, Justin Lu <[email protected]> wrote: >> This PR corrects the special case handling in `Locale.Builder.setLocale`. >> The current handling always assumes a `Locale` matching the `ja/JP/JP` and >> `th/TH/TH` special cases will contain the correct compatibility extensions. >> A user can remove the extension or create a Locale in the form of the >> special case without the correct compatibility extension. >> >> For example, the current implementation does the following, >> >>> jshell> loc = new Builder().setLocale(Locale.of("ja", "JP", >>> "JP").stripExtensions()).build() >>> loc ==> ja_JP >>> >>> jshell> loc = new >>> Builder().setLocale(Locale.forLanguageTag("ja-JP-u-ca-foobar-x-lvariant-JP")).build() >>> loc ==> ja_JP_#u-ca-foobar >> >> That is, it silently discards the ill-formed JP variant. >> >> With assertions on, this instead becomes a `NullPointerException` when the >> extensions are not present, or an `AssertionError` when the extension has >> the wrong value. >> >> For the example above, one would expect an `IllFormedLocaleException` to be >> thrown, since without a correct compatibility extension, JP is merely an >> invalid variant and `setLocale(Locale)` throws on ill-formed fields. >> >> The changes in this PR ensure that these cases throw as expected. >> >> --------- >> - [x] I confirm that I make this contribution in accordance with the >> [OpenJDK Interim AI Policy](https://openjdk.org/legal/ai). > > Justin Lu has updated the pull request incrementally with one additional > commit since the last revision: > > Address other areas + narrow matching to exact matches only
src/java.base/share/classes/sun/util/locale/provider/LocaleServiceProviderPool.java line 376: > 374: // Extensions can exist while variant is ill-formed > 375: // Simply strip the extensions so that all fields are > preserved > 376: lookupLocale = lookupLocale.stripExtensions(); The old comment was wrong, it was entirely possible for a locale to have non-empty extensions with ill-formed variant. For example, `"en-Latn-US-a-foo-x-lvariant-xy"` and this catch block is entirely possible. I think stripping the extension is a better solution than trying to reconstruct with the `of` factory since the script is retained. ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/31728#discussion_r3546343076
