On Tue, 30 Jun 2026 17:22:25 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).

This pull request has now been integrated.

Changeset: d343e6c8
Author:    Justin Lu <[email protected]>
URL:       
https://git.openjdk.org/jdk/commit/d343e6c854f2851c3bd09d850898b0d79950e718
Stats:     131 lines in 7 files changed: 80 ins; 7 del; 44 mod

8387455: Restrict legacy Locale compatibility handling to exact matches

Reviewed-by: naoto

-------------

PR: https://git.openjdk.org/jdk/pull/31728

Reply via email to