Skip to content

Commit 93d7b6e

Browse files
authored
Merge pull request #40817 from buttaface/56-icu
[5.6][build] Clean up ICU detritus that is no longer used to build the stdlib
2 parents b6ac777 + 75dba94 commit 93d7b6e

23 files changed

+20
-261
lines changed

β€ŽCMakeLists.txt

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -304,23 +304,6 @@ set(SWIFT_ANDROID_NDK_CLANG_VERSION "12.0.8" CACHE STRING
304304
set(SWIFT_ANDROID_DEPLOY_DEVICE_PATH "" CACHE STRING
305305
"Path on an Android device where build products will be pushed. These are used when running the test suite against the device")
306306

307-
#
308-
# User-configurable ICU specific options for Android, FreeBSD, Linux, Haiku, and WASI.
309-
#
310-
311-
foreach(sdk ANDROID;FREEBSD;LINUX;WINDOWS;HAIKU;WASI)
312-
foreach(arch aarch64;armv6;armv7;i686;powerpc64;powerpc64le;s390x;wasm32;x86_64)
313-
set(SWIFT_${sdk}_${arch}_ICU_UC "" CACHE STRING
314-
"Path to a directory containing the icuuc library for ${sdk}")
315-
set(SWIFT_${sdk}_${arch}_ICU_UC_INCLUDE "" CACHE STRING
316-
"Path to a directory containing headers for icuuc for ${sdk}")
317-
set(SWIFT_${sdk}_${arch}_ICU_I18N "" CACHE STRING
318-
"Path to a directory containing the icui18n library for ${sdk}")
319-
set(SWIFT_${sdk}_${arch}_ICU_I18N_INCLUDE "" CACHE STRING
320-
"Path to a directory containing headers icui18n for ${sdk}")
321-
endforeach()
322-
endforeach()
323-
324307
#
325308
# User-configurable Darwin-specific options.
326309
#

β€Žcmake/modules/SwiftConfigureSDK.cmake

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ function(_report_sdk prefix)
6363
if(NOT prefix IN_LIST SWIFT_DARWIN_PLATFORMS)
6464
foreach(arch ${SWIFT_SDK_${prefix}_ARCHITECTURES})
6565
message(STATUS " ${arch} libc header path: ${SWIFT_SDK_${prefix}_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY}")
66-
message(STATUS " ${arch} libc architecture specific header path: ${SWIFT_SDK_${prefix}_ARCH_${arch}_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY}")
6766
endforeach()
6867
endif()
6968

@@ -288,7 +287,6 @@ macro(configure_sdk_unix name architectures)
288287
swift_android_sysroot(android_sysroot)
289288
set(SWIFT_SDK_ANDROID_ARCH_${arch}_PATH "${android_sysroot}")
290289
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY "${android_sysroot}/usr/include" CACHE STRING "Path to C library headers")
291-
set(SWIFT_SDK_ANDROID_ARCH_${arch}_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY "${android_sysroot}/usr/include" CACHE STRING "Path to C library architecture headers")
292290

293291
if("${arch}" STREQUAL "armv7")
294292
set(SWIFT_SDK_ANDROID_ARCH_${arch}_NDK_TRIPLE "arm-linux-androideabi")
@@ -320,10 +318,8 @@ macro(configure_sdk_unix name architectures)
320318

321319
if("${prefix}" STREQUAL "HAIKU")
322320
set(SWIFT_SDK_HAIKU_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY "/system/develop/headers/posix" CACHE STRING "Path to C library headers")
323-
set(SWIFT_SDK_HAIKU_ARCH_${arch}_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY "/system/develop/headers" CACHE STRING "Path to C library architecture headers")
324321
else()
325322
set(SWIFT_SDK_${prefix}_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY "/usr/include" CACHE STRING "Path to C library headers")
326-
set(SWIFT_SDK_${prefix}_ARCH_${arch}_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY "${SWIFT_SDK_${prefix}_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY}/${CMAKE_LIBRARY_ARCHITECTURE}" CACHE STRING "Path to C library architecture headers")
327323
endif()
328324

329325
if("${prefix}" STREQUAL "LINUX")
@@ -373,7 +369,6 @@ macro(configure_sdk_unix name architectures)
373369
set(SWIFT_SDK_WASI_ARCH_wasm32_PATH "${SWIFT_WASI_SYSROOT_PATH}")
374370
set(SWIFT_SDK_WASI_ARCH_wasm32_TRIPLE "wasm32-unknown-wasi")
375371
set(SWIFT_SDK_WASI_ARCH_wasm32_LIBC_INCLUDE_DIRECTORY "${SWIFT_WASI_SYSROOT_PATH}/include")
376-
set(SWIFT_SDK_WASI_ARCH_wasm32_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY "${SWIFT_WASI_SYSROOT_PATH}/include")
377372
else()
378373
message(FATAL_ERROR "unknown Unix OS: ${prefix}")
379374
endif()

β€Ždocs/Android.md

Lines changed: 9 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -43,51 +43,22 @@ To follow along with this guide, you'll need:
4343

4444
## "Hello, world" on Android
4545

46-
### 1. Downloading (or building) the Swift Android stdlib dependencies
46+
### 1. Building the Swift stdlib for Android
4747

48-
You may have noticed that, in order to build the Swift stdlib for Linux, you
49-
needed to `apt-get install libicu-dev icu-devtools`. Similarly, building
50-
the Swift stdlib for Android requires the libiconv and libicu libraries.
51-
However, you'll need versions of these libraries that work on Android devices.
52-
53-
The steps are as follows:
54-
55-
1. Ensure you have `curl`, `autoconf`, `automake`, `libtool`, and
56-
`git` installed.
57-
2. Clone the [SwiftAndroid/libiconv-libicu-android](https://github.com/SwiftAndroid/libiconv-libicu-android)
58-
project. From the command-line, run the following command:
59-
`git clone https://github.com/SwiftAndroid/libiconv-libicu-android.git`.
60-
3. From the command-line, run `which ndk-build`. Confirm that the path to
61-
the `ndk-build` executable in the Android NDK you downloaded is displayed.
62-
If not, you may need to add the Android NDK directory to your `PATH`.
63-
4. Change directories into `libiconv-libicu-android`: `cd libiconv-libicu-android`
64-
5. Run the Swift build script: `./build-swift.sh`
65-
6. Confirm that the various `libicuXYZswift.so` libraries are located in the
66-
`armeabi-v7a` directory.
67-
68-
### 2. Building the Swift stdlib for Android
69-
70-
Enter your Swift directory, then run the build script, passing paths to the
71-
Android NDK, as well as the directories that contain the `libicuucswift.so` and
72-
`libicui18nswift.so` you downloaded or built in step one:
48+
Enter your Swift directory, then run the build script, passing the path to the
49+
Android NDK:
7350

7451
```
75-
$ ARM_DIR=path/to/libiconv-libicu-android/armeabi-v7a
7652
$ NDK_PATH=path/to/android-ndk-r23b
7753
$ utils/build-script \
7854
-R \ # Build in ReleaseAssert mode.
7955
--android \ # Build for Android.
8056
--android-ndk $NDK_PATH \ # Path to an Android NDK.
8157
--android-arch armv7 \ # Optionally specify Android architecture, alternately aarch64 or x86_64
82-
--android-api-level 21 \ # The Android API level to target. Swift only supports 21 or greater.
83-
--android-icu-uc ${ARM_DIR}/libicuucswift.so \
84-
--android-icu-uc-include ${ARM_DIR}/icu/source/common \
85-
--android-icu-i18n ${ARM_DIR}/libicui18nswift.so \
86-
--android-icu-i18n-include ${ARM_DIR}/icu/source/i18n \
87-
--android-icu-data ${ARM_DIR}/libicudataswift.so
58+
--android-api-level 21 # The Android API level to target. Swift only supports 21 or greater.
8859
```
8960

90-
### 3. Compiling `hello.swift` to run on an Android device
61+
### 2. Compiling `hello.swift` to run on an Android device
9162

9263
Create a simple Swift file named `hello.swift`:
9364

@@ -121,7 +92,7 @@ This is exactly the error we want: the executable is built to run on an
12192
Android device--it does not run on Linux. Next, let's deploy it to an Android
12293
device in order to execute it.
12394

124-
### 4. Deploying the build products to the device
95+
### 3. Deploying the build products to the device
12596

12697
You can use the `adb push` command to copy build products from your Linux
12798
environment to your Android device. If you haven't already installed `adb`,
@@ -142,14 +113,6 @@ $ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswi
142113
$ adb push build/Ninja-ReleaseAssert/swift-linux-x86_64/lib/swift/android/libswiftRemoteMirror.so /data/local/tmp
143114
```
144115

145-
You will also need to push the icu libraries:
146-
147-
```
148-
adb push /path/to/libicu-android/armeabi-v7a/libicudataswift.so /data/local/tmp
149-
adb push /path/to/libicu-android/armeabi-v7a/libicui18nswift.so /data/local/tmp
150-
adb push /path/to/libicu-android/armeabi-v7a/libicuucswift.so /data/local/tmp
151-
```
152-
153116
In addition, you'll also need to copy the Android NDK's libc++:
154117

155118
```
@@ -162,7 +125,7 @@ previous step:
162125
$ adb push hello /data/local/tmp
163126
```
164127

165-
### 5. Running "Hello, world" on your Android device
128+
### 4. Running "Hello, world" on your Android device
166129

167130
You can use the `adb shell` command to execute the `hello` executable on
168131
the Android device:
@@ -182,7 +145,7 @@ Congratulations! You've just run your first Swift program on Android.
182145
## Running the Swift test suite hosted on an Android device
183146

184147
When running the test suite, build products are automatically pushed to your
185-
device. As in part four, you'll need to connect your Android device via USB:
148+
device. As in part three, you'll need to connect your Android device via USB:
186149

187150
1. Connect your Android device to your computer via USB. Ensure that remote
188151
debugging is enabled for that device by following the official instructions:
@@ -198,10 +161,5 @@ $ utils/build-script \
198161
--android \ # Build for Android.
199162
--android-ndk ~/android-ndk-r23b \ # Path to an Android NDK.
200163
--android-arch armv7 \ # Optionally specify Android architecture, alternately aarch64
201-
--android-ndk-version 21 \
202-
--android-icu-uc ~/libicu-android/armeabi-v7a/libicuuc.so \
203-
--android-icu-uc-include ~/libicu-android/armeabi-v7a/icu/source/common \
204-
--android-icu-i18n ~/libicu-android/armeabi-v7a/libicui18n.so \
205-
--android-icu-i18n-include ~/libicu-android/armeabi-v7a/icu/source/i18n/ \
206-
--android-icu-data ~/libicu-android/armeabi-v7a/libicudata.so
164+
--android-ndk-version 21
207165
```

β€Ždocs/AndroidBuild.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,6 @@ cmake -C S:\swift-build\cmake\caches\android-armv7.cmake
7474
-DANDROID_ALTERNATE_TOOLCHAIN=S:/b/a/Library/Developer/Toolchains/unknown-Asserts-development.xctoolchain/usr ^
7575
-DLLVM_DIR=S:/b/a/llvm/lib/cmake/llvm ^
7676
-DSWIFT_NATIVE_SWIFT_TOOLS_PATH=S:/b/a/Library/Developer/Toolchains/unknown-Asserts-development.xctoolchain/usr/bin ^
77-
-DSWIFT_ANDROID_armv7_ICU_UC_INCLUDE=S:/b/a/Library/icu-64/usr/include/unicode ^
78-
-DSWIFT_ANDROID_armv7_ICU_UC=S:/b/a/Library/icu-64/usr/lib/libicuuc64.so ^
79-
-DSWIFT_ANDROID_armv7_ICU_I18N_INCLUDE=S:/b/a/Library/icu-64/usr/include ^
80-
-DSWIFT_ANDROID_armv7_ICU_I18N=S:/b/a/Library/icu-64/usr/lib/libicuin64.so ^
8177
S:/swift
8278
ninja
8379
ninja install

β€Ždocs/WindowsBuild.md

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ structure should resemble:
9292
β”• usr/...
9393
```
9494

95-
Note that only ICU is required for building the toolchain, and SQLite is only
95+
Note that ICU is only required for building Foundation, and SQLite is only
9696
needed for building llbuild and onwards. The ICU project provides binaries,
9797
alternatively, see the ICU project for details on building ICU from source.
9898

@@ -134,10 +134,6 @@ cmake -B "S:\b\1" ^
134134
-D LLVM_EXTERNAL_CMARK_SOURCE_DIR=S:\cmark ^
135135
-D LLVM_EXTERNAL_SWIFT_SOURCE_DIR=S:\swift ^
136136
-D SWIFT_PATH_TO_LIBDISPATCH_SOURCE=S:\swift-corelibs-libdispatch ^
137-
-D SWIFT_WINDOWS_x86_64_ICU_I18N_INCLUDE=S:\Library\icu-67\usr\include ^
138-
-D SWIFT_WINDOWS_x86_64_ICU_I18N=S:\Library\icu-67\usr\lib\icuin67.lib ^
139-
-D SWIFT_WINDOWS_x86_64_ICU_UC_INCLUDE=S:\Library\icu-67\usr\include ^
140-
-D SWIFT_WINDOWS_x86_64_ICU_UC=S:\Library\icu-67\usr\lib\icuuc67.lib ^
141137
-G Ninja ^
142138
-S S:\llvm-project\llvm
143139

β€Ždocs/WindowsCrossCompile.md

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,14 @@ the `build-script` invocation to achieve this. You will need to expand out the
3030
path where `llvm-ar` and `llvm-ranlib` are built. These are needed to correctly
3131
build the static libraries. Note that cross-compiling will require the use of
3232
`lld`. Ensure that `lld-link.exe` is available to clang via your path.
33-
Additionally, the ICU headers and libraries need to be provided for the build.
3433

3534
#### macOS
3635

3736
```bash
3837
--extra-cmake-options=-DSWIFT_BUILD_RUNTIME_WITH_HOST_COMPILER=FALSE,\
3938
-DCMAKE_AR=<path to llvm-ar>,\
4039
-DCMAKE_RANLIB=<path to llvm-ranlib>,\
41-
-DSWIFT_SDKS='OSX;WINDOWS',\
42-
-DSWIFT_WINDOWS_x86_64_ICU_I18N_INCLUDE=<path to ICU i18n includes>,\
43-
-DSWIFT_WINDOWS_x86_64_ICU_UC_INCLUDE=<path to ICU UC includes>,\
44-
-DSWIFT_WINDOWS_x86_64_ICU_I18N=<path to ICU i18n lib>,\
45-
-DSWIFT_WINDOWS_x86_64_ICU_UC=<path to ICU UC lib>
40+
-DSWIFT_SDKS='OSX;WINDOWS'
4641
```
4742

4843
#### Linux

β€Žstdlib/cmake/modules/AddSwiftStdlib.cmake

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,17 +1144,9 @@ function(add_swift_target_library_single target name)
11441144
target_link_libraries("${target}" INTERFACE ${SWIFTLIB_SINGLE_LINK_LIBRARIES})
11451145
endif()
11461146

1147-
# Don't add the icucore target.
1148-
set(SWIFTLIB_SINGLE_LINK_LIBRARIES_WITHOUT_ICU)
1149-
foreach(item ${SWIFTLIB_SINGLE_LINK_LIBRARIES})
1150-
if(NOT "${item}" STREQUAL "icucore")
1151-
list(APPEND SWIFTLIB_SINGLE_LINK_LIBRARIES_WITHOUT_ICU "${item}")
1152-
endif()
1153-
endforeach()
1154-
11551147
if(target_static)
11561148
_list_add_string_suffix(
1157-
"${SWIFTLIB_SINGLE_LINK_LIBRARIES_WITHOUT_ICU}"
1149+
"${SWIFTLIB_SINGLE_LINK_LIBRARIES}"
11581150
"-static"
11591151
target_static_depends)
11601152
# FIXME: should this be target_link_libraries?

β€Žstdlib/public/Platform/CMakeLists.txt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,7 @@ foreach(sdk ${SWIFT_SDKS})
149149
OUTPUT "${glibc_modulemap_out}"
150150
FLAGS
151151
"-DCMAKE_SDK=${sdk}"
152-
"-DGLIBC_INCLUDE_PATH=${SWIFT_SDK_${sdk}_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY}"
153-
"-DGLIBC_ARCH_INCLUDE_PATH=${SWIFT_SDK_${sdk}_ARCH_${arch}_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY}")
152+
"-DGLIBC_INCLUDE_PATH=${SWIFT_SDK_${sdk}_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY}")
154153

155154
list(APPEND glibc_modulemap_target_list ${glibc_modulemap_target})
156155

@@ -185,15 +184,12 @@ foreach(sdk ${SWIFT_SDKS})
185184

186185
string(REPLACE "${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_ARCH_${arch}_PATH}"
187186
"" absolute_libc_include_path "${SWIFT_SDK_${sdk}_ARCH_${arch}_LIBC_INCLUDE_DIRECTORY}")
188-
string(REPLACE "${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_ARCH_${arch}_PATH}"
189-
"" absolute_libc_arch_include_path ${SWIFT_SDK_${sdk}_ARCH_${arch}_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY})
190187

191188
handle_gyb_source_single(glibc_modulemap_native_target
192189
SOURCE "${glibc_modulemap_source}"
193190
OUTPUT "${glibc_sysroot_relative_modulemap_out}"
194191
FLAGS "-DCMAKE_SDK=${sdk}"
195-
"-DGLIBC_INCLUDE_PATH=${absolute_libc_include_path}"
196-
"-DGLIBC_ARCH_INCLUDE_PATH=${absolute_libc_arch_include_path}")
192+
"-DGLIBC_INCLUDE_PATH=${absolute_libc_include_path}")
197193

198194
list(APPEND glibc_modulemap_target_list ${glibc_modulemap_native_target})
199195
set(glibc_modulemap_out ${glibc_sysroot_relative_modulemap_out})

β€Žtest/CMakeLists.txt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -338,13 +338,7 @@ foreach(SDK ${SWIFT_SDKS})
338338
--destination "${SWIFT_ANDROID_DEPLOY_DEVICE_PATH}"
339339
--destination-arch "${ARCH}"
340340
# Build products like libswiftCore.so.
341-
"${SWIFTLIB_DIR}/android"
342-
# These two directories may contain the same libraries,
343-
# but upload both to device just in case. Duplicates will be
344-
# overwritten, and uploading doesn't take very long anyway.
345-
"${SWIFT_ANDROID_${ARCH}_ICU_UC}"
346-
"${SWIFT_ANDROID_${ARCH}_ICU_I18N}"
347-
"${SWIFT_ANDROID_${ARCH}_ICU_DATA}")
341+
"${SWIFTLIB_DIR}/android")
348342
endif()
349343
add_custom_target("upload-stdlib${VARIANT_SUFFIX}"
350344
${command_upload_stdlib}

β€Žtest/stdlib/Character.swift

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -84,16 +84,12 @@ var testCharacters = [
8484
"\u{0061}\u{0300}\u{0300}\u{0300}\u{0300}", // UTF-8: 9 bytes
8585
]
8686

87-
// Only run it on ObjC platforms. Supported Linux versions do not have a
88-
// recent enough ICU
89-
#if _runtime(_ObjC)
9087
testCharacters += [
9188
"\u{0061}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}", // UTF-8: 11 bytes
9289
"\u{0061}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}", // UTF-8: 13 bytes
9390
"\u{0061}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}", // UTF-8: 15 bytes
9491
"\u{0061}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}", // UTF-8: 17 bytes
9592
]
96-
#endif
9793

9894
testCharacters += [
9995
// U+00A9 COPYRIGHT SIGN
@@ -105,8 +101,6 @@ testCharacters += [
105101
"\u{00a9}\u{0300}\u{0300}\u{0300}\u{0300}", // UTF-8: 10 bytes
106102
]
107103

108-
// Only run it on recent enough versions of ICU
109-
#if _runtime(_ObjC)
110104
if #available(iOS 11.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *) {
111105
testCharacters += [
112106
"\u{00a9}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}", // UTF-8: 12 bytes
@@ -117,7 +111,6 @@ if #available(iOS 11.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *) {
117111
"πŸ‘©β€πŸ‘©β€πŸ‘¦β€πŸ‘¦", // UTF-8: 25 bytes
118112
]
119113
}
120-
#endif
121114

122115
func randomGraphemeCluster(_ minSize: Int, _ maxSize: Int) -> String {
123116
let n = Int.random(in: (minSize + 1) ..< maxSize)
@@ -224,9 +217,6 @@ CharacterTests.test("CR-LF") {
224217
}
225218

226219
CharacterTests.test("Unicode 9 grapheme breaking") {
227-
// Only run it on ObjC platforms. Supported Linux versions do not have a
228-
// recent enough ICU for Unicode 9 support.
229-
#if _runtime(_ObjC)
230220
// Check for Unicode 9 or later
231221
guard #available(iOS 10.0, macOS 10.12, *) else { return }
232222

@@ -241,7 +231,6 @@ CharacterTests.test("Unicode 9 grapheme breaking") {
241231
let skinTone = "πŸ‘‹πŸ‘‹πŸ»πŸ‘‹πŸΌπŸ‘‹πŸ½πŸ‘‹πŸΎπŸ‘‹πŸΏ"
242232
expectEqual(6, skinTone.count)
243233
expectEqual(skinTone.reversed().count, skinTone.count)
244-
#endif
245234
}
246235

247236
/// Test that a given `String` can be transformed into a `Character` and back

β€Žtest/stdlib/CharacterProperties.swift

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,12 +143,7 @@ CharacterPropertiesTests.test("Casing") {
143143

144144
expectEqual("SS", Character("ß").uppercased())
145145

146-
// Some versions of ICU on Linux (62.1) have a bug producing the wrong value
147-
// when lowercasing "ẞ". Darwin platforms never shipped this version, so
148-
// conditionally test based on platform.
149-
#if canImport(Darwin)
150146
expectEqual("ß", Character("ẞ").lowercased())
151-
#endif
152147

153148
expectEqual("и", Character("И").lowercased())
154149
expectEqual("И", Character("и").uppercased())

β€Žutils/android/build-toolchain

Lines changed: 0 additions & 48 deletions
This file was deleted.

0 commit comments

Comments
Β (0)